Simple scenario:

class IObject {};

class Base : public IObject {
public:
   virtual void foo() {}
};

class Derived : public Base {
   virtual void foo() {}
};

Both IObject and Base are exported into Python:

bp::class_<IObject,noncopyable>( "IObject", bp::no_init );

bp::class_<Base,bp::bases<IObject>,noncopyable>( "Base", bp::no_init )
   .def( "foo", &Base::foo );

Also imagine I've got function like this:

IObjectPtr
create( std::string const& class_name )
{
...
  if(class_name=="Derived")
     return IObjectPtr(new Derived);
}

and this function is also exported into Python.

Now in Python I've got code like this:

o = mymodule.create( "Derived" );
print type(o)

As it stands above print statement produces "mymodule.IObject". What would be
preferable if it can produce mymodule.Base, so I can invoke method foo.

It can be resolved with additional export for class Derived:

bp::class_<Derived,bp::bases<Base>,noncopyable>( "Derived", bp::no_init );

In which case above print statement starts to show mymodule.Derived. But I would
really prefer to avoid these exports for derived classes. After all RTTI
information should shoe Boost.Python whole hierarchy, isn't it? Why can't it
figure out that pointer produced by create actually convertible to Base*, even
though it knows nothing about Derived?

Does any one have any workarounds?

Thanks,

Gennadiy


_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig

Reply via email to