Wrapping classes with pure virtual functions

G

gabriel.becedillas

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");
boost::python::class_<Derived> class_derived("Derived");
return 0;
}

The first line inside main (the one exporting Base) is causing the
compile time error:
error C2259: 'Base' : cannot instantiate abstract class...
The probem seems to be that struct value_holder<Base> holds a Base
member instance by value, and this is not possible since Base can't be
instantiated.
I'm using Visual Studio 2005 and boost 1.33.1.
Thanks
 
C

Chris Lambacher

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.
 
G

gabriel.becedillas

Chris said:
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.
 
C

Carl Banks

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,764
Messages
2,569,564
Members
45,039
Latest member
CasimiraVa

Latest Threads

Top