Wrapping classes with pure virtual functions

Carl Banks pavlovevidence at gmail.com
Sun Dec 17 13:14:07 EST 2006


gabriel.becedillas at gmail.com wrote:
> Chris Lambacher wrote:
> > On Thu, Dec 14, 2006 at 01:57:10PM -0800, gabriel.becedillas at gmail.com wrote:
> > > Hi,
> > > I'm having problems wrapping a hierarchy of classes, actually having
> > > problems wrapping the base class. I don't need to use the WrapClass
> > > mechanism since I don't want to override classes in Python. My code
> > > boils down to:
> > >
> > > class Base
> > > {
> > > public:
> > > 	virtual ~Base()
> > > 	{}
> > >
> > > 	virtual void f() = 0;
> > > };
> > >
> > > class Derived :
> > > 	public Base
> > > {
> > > public:
> > > 	virtual void f()
> > > 	{}
> > >
> > > 	void g()
> > > 	{}
> > > };
> > >
> > > int main()
> > > {
> > > 	boost::python::class_<Base> class_base("Base");
> > Why are you trying to make this type visible to python?  It is pure virtual,
> > you can never instantiate it.
>
> Because I want to use subclasses of Base polymorphically from Python.
> Python will receive an instance of some Base subclass through a another
> exported function.

I don't know much about Boost.  Does it have anything like
boost::python::pointer_<Base>?

You can't get polymorphism by direct access to a class.  C++ compiler
always knows the exact type of a direct, non-pointer-accessed object.
So even if you could create a class_<Base>, it would only ever be a
Base, and never a derived class.  You have to use pointers to get
polymorphism.

As an alternative, consider wrapping the derived classes instead.  It
might not be much more work if Boost wraps everything nicely.


Carl Banks




More information about the Python-list mailing list