我使用的是用C ++编写的库,并通过SWIG暴露给Python。类层次结构如下所示:
PublicLib:
MyBaseClass
PrivateLib:
MyAbstractClass
SomePrivateSubclass : MyAbstractClass, MyBaseClass
...
请注意这里的多重继承方案。另请注意,PublicLib和PrivateLib中的类都以Python对象的形式向我公开。
现在,我想在另一个库中调用C ++函数,将指针传递给SomePrivateSubClass
个对象之一。该函数如下所示:
void RegisterCallback(void* param);
然后,我希望我将通过回调接收对象,即:
void SomeCallback(void* param) {
MyBaseClass& cls = *(MyBaseClass*)param;
cls.xxxx; // FAIL
}
它失败的原因是我收到的指针不是基类(MyBaseClass
),而是其中一个子类。在“普通”C ++中,我会做类似的事情:
void RegisterCallback(MyBaseClass* param) { ... }
void SomeCallback(void* param) {
MyBaseClass& cls = *(MyBaseClass*)param;
cls.xxxx; // FAIL
}
并且编译器会为我处理所有这些。
问题是,在这种情况下,有什么方法可以获得指向基类的指针吗?我可以在Python端操作代码,但SWIG似乎没有办法转换为基类(我可以看到)。我也试过使用RTTI,但似乎虽然我可以获得类型标识符,但我无法获取任何其他类型信息,例如基类的大小或指针。