[C++-sig] Cross Module Inheritance and Downcast (original) (raw)

Joseph Lisee jlisee at gmail.com
Fri Jan 11 19:28:28 CET 2008


Hello All,

I am having trouble getting cross module inheritance/downcasting to work. All of the following types are wrapped up in shared_ptrs. Here is the code layout:

Shared Library A: Has the Base class. It implements virtual functions of the Base class. It also has a factory which produces objects referred to by a Base class shared_ptr. This includes the ability to produce Derived class objects referred to by the Base class shared_ptr. It does not link to "Shared Library B", or know anything of the derived types.

Shared Library B: Has the Derived class and links to "Shared Library A". It implements virtual functions of the Derived class.

Extension Module A: This is linked to "Shared Library A". The base class is wrapped like so:

class BaseWrapper: public Base, public bp::wrapper< Base > { ... more code ... }

void registerBaseClass() { bp::class_<BaseWrapper, bp::bases< ... more code ...>, boost::noncopyable >( ... more code ...). ... more code ... }

Extension Module B: This is linked to both "Shared Library A", and "Shared Library B". It wraps the derived class like so:

struct Derived_wrapper : Derived, bp::wrapper< Derived > { ... more code ... }

void register_Derived_class(){ bp::class_< Derived_wrapper, bp::bases< Base >, boost::noncopyable >( ... more code ...). ... more code ... }

This issue is that when I call the factory in "Extension Module A" from python it only gives me the Base class objects. It does not automatically downcast. I do have both the Base and Derived class extension modules imported, and I imported the Base class one first. I get this same behavior on Windows, Linux and Mac.

So to fix this I tried to create a manual cast function: boost::shared_ptr castTo(boost::shared_ptr from) { return boost::dynamic_pointer_cast(from); }

Now the cast function works on Linux just fine, but on Windows and Mac it just returns the same python object I give it.

Can anyone point me to how I should be doing this? Has anyone got a system like this to work?

-Joseph Lisee



More information about the Cplusplus-sig mailing list