多个继承/虚拟函数
Multiple Inheritance/Virtual Functions
使用Cython(充当接口,以便我可以通过Python调用基于C++的函数),我试图包装C++类的复杂层次结构,所有这些类最终都继承自一个基类。这个奇异基类有许多虚拟函数,它们的实现因所考虑的派生类而异。派生类也有自己独特的函数。
我在通过Cython实现这一点时遇到了很多困难,主要是因为我找不到一种方法来将每个继承类中的self.thisptr重新定义为特定类型(而不是奇异基类的类型)。我也尝试过类型转换,也尝试过删除指针,然后重新初始化它,但它仍然认为它指向同一个基类。示例代码如下:
inheritTest.pyx:
cdef extern from "BaseClass.h":
cdef cppclass BaseClass:
BaseClass() except +
void SetName(string)
float Evaluate(float)
bool DataExists()
cdef extern from "DerivedClass.h":
cdef cppclass DerivedClass(BaseClass):
DerivedClass() except +
void MyFunction()
float Evaluate(float)
bool DataExists()
SetObject(BaseClass *)
cdef class PyBaseClass:
cdef BaseClass *thisptr
def __cinit__(self):
self.thisptr = new BaseClass()
def __dealloc__(self):
del self.thisptr
cdef class PyDerivedClass(PyBaseClass):
#This is one of the solutions that I have tried
def __cinit__(self):
if(self.thisptr):
del self.thisptr
self.thisptr = new DerivedClass()
def __dealloc__(self):
del self.thisptr
def Evaluate(self, time):
#I need to call the Derived implementation of this function, not Base
return self.thisptr.Evaluate(self,time)
def SetObject(self, PyBaseClass inputObject):
#The issue here is that it looks for SetObject to be declared in BaseClass and spits an error otherwise. If I put a empty declaration, the complain is of ambiguous method overload
self.thisptr.SetObject(inputObject.thisptr)
此外,当我在Python脚本中调用SetObject时,我希望能够传入PyDerived对象作为输入,因为它继承自PyBase,难道它不应该工作吗?我试过了,错误是:
参数的类型不正确:应为PyBase,得到PyDerived
希望我的问题有意义,如果您需要任何其他信息,请告诉我:)
与其删除self.thisptr
的旧副本,不如让基类的构造函数仅在self
的类型为基类时初始化指针。
def __cinit__(self):
if type(self) is PyBaseClass:
self.thisptr = new BaseClass()
确保在基类__dealloc__
方法中也以同样的方式防止释放。
然后,为了避免一堆不必要的强制转换,在子类包装器中,制作两个不同的属性,一个存储指向被强制转换为基类类型的c++对象的指针,另一个存储具有原始类型的指向c++对象的指针。类似这样的东西:
cdef DerivedClass* derivedptr
def __cinit__(self):
self.derivedptr = self.thisptr = new DerivedClass()
然后,当您需要访问派生类的方法时,请改用派生指针。
请确保,在解除分配时,只删除派生指针。
我从Cython用户邮件列表上的讨论中得到了这个想法。
相关文章:
- C++无法定义虚拟函数 OUTER 类和头文件
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 类型擦除的std::function与虚拟函数调用的开销
- 重写虚拟函数和继承
- 用纯虚拟函数兜圈子
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 禁止子函数调用父级的抽象(或虚拟)函数
- 无法在子类中使用虚拟函数C++
- 无法在派生对象上运行虚拟函数
- 我可以调用从 main() 覆盖的虚拟函数吗?
- 在 C++ 中将函数获取和设置为虚拟函数
- 使用在堆栈上创建的对象调用虚拟函数
- 为什么在这种情况下不调用我的虚拟函数实现?
- 在C++中使虚拟函数私有化
- 模板继承类中的虚拟函数
- 为什么构造函数的虚拟函数调用有时有效,但其他调用却无效
- doxygenc++虚拟函数和实现
- 如何从派生类函数中调用虚拟函数