多重继承/虚函数

2024-09-29 06:29:41 发布

您现在位置:Python中文网/ 问答频道 /正文

使用Cython(作为接口,因此我可以通过Python调用C++函数),我试图包装一个复杂的C++类层次结构,所有这些结构最终都继承自一个基类。这个单数基类有许多虚函数,它们的实现因所考虑的派生类而异。派生类也有自己独特的函数。在

我很难通过Cython来包装这个,主要是因为我找不到重新定义本公司在每个继承的类中都属于该特定类型(而不是单个基类的类型)。我也尝试过类型转换,以及尝试删除指针,然后重新初始化它,但它仍然认为它指向同一基类。示例代码如下:

在继承测试.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,而get为PyDerived

希望我的问题有意义,如果您需要更多信息,请告诉我:)


Tags: 函数self类型isdeffloat基类evaluate
1条回答
网友
1楼 · 发布于 2024-09-29 06:29:41

与其删除self.thisptr的旧副本,不如使基类的构造函数仅在self的类型是基类的情况下初始化指针。在

def __cinit__(self):
    if type(self) is PyBaseClass:
        self.thisptr = new BaseClass()

请确保在基类__dealloc__方法中也以同样的方式防止释放。在

然后,为了避免一堆不必要的强制转换,在子类包装器中,生成两个不同的属性,一个存储转换为基类类型的c++对象的指针,另一个存储指向具有原始类型的c++对象的指针。像这样:

^{pr2}$

然后,当需要访问派生类的方法时,请改用派生指针。在

请确保在取消分配时,只删除派生指针。在

我从这个关于Cython Users mailing list的讨论中得到了这个想法。在

相关问题 更多 >