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

Roman Yakovenko roman.yakovenko at gmail.com
Fri Jan 11 20:19:01 CET 2008


On Jan 11, 2008 8:28 PM, Joseph Lisee <jlisee at gmail.com> wrote:

Hello All,

I am having trouble getting cross module inheritance/downcasting to work. All of the following types are wrapped up in sharedptrs. 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 sharedptr. This includes the ability to produce Derived class objects referred to by the Base class sharedptr. 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 Derivedwrapper : Derived, bp::wrapper< Derived > { ... more code ... } void registerDerivedclass(){ bp::class< Derivedwrapper,_ _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::sharedptr castTo(boost::sharedptr from) { return boost::dynamicpointercast(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?

I could be wrong, but there is a known problem with the library. You can search this mailing list and find the patch.

-- Roman Yakovenko C++ Python language binding http://www.language-binding.net/



More information about the Cplusplus-sig mailing list