[C++-sig] Cross Module Inheritance and Downcast (original) (raw)
Joseph Lisee jlisee at gmail.com
Fri Jan 11 19:28:28 CET 2008
- Previous message: [C++-sig] Memory Leak in MFC/C++ based Python Extended/Embedded code.
- Next message: [C++-sig] Cross Module Inheritance and Downcast
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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
- Previous message: [C++-sig] Memory Leak in MFC/C++ based Python Extended/Embedded code.
- Next message: [C++-sig] Cross Module Inheritance and Downcast
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]