导出到Python的虚拟和派生C ++类

时间:2015-07-10 21:04:25

标签: python c++ boost virtual boost-python

我有一个虚拟基类:

class H{
    public:
    H(); // the implementation is in .cpp file, so this is not pure virtual
    virtual ~H();
    //... // other members
};

和派生类:

class Hm : public H{
public:
 Hm(){ /*define constructor*/ }
...
   void method1();
};

我使用Boost.Python将两个类导出到Python。接下来,假设有另一个类X包含H类型的变量:

class X{
public:     
 X(){ /*define constructor*/ }
 H  h;  // data member
 //...
};

类和变量h也暴露给Python。现在,在Python中我可以这样做:

x = X()  # construct the object x of type X
x.h = Hm()  # assign the data member of type H to the object of type Hm
            # no problem with that, because of the inheritance

现在,问题是 - 如何从x.h调用类Hm(method1)的方法?对象x.h是H类型,它不定义派生类method1的方法。所以电话

x.h.method1()

给出错误

那么,有没有办法做到这一点?或许我需要改变课程的设计。在后一种情况下,对于我在上面的例子中试图使用的最佳方式是什么?

1 个答案:

答案 0 :(得分:2)

您在此处遇到的行为称为切片。 "切"您将派生类的对象分配给基类的实例,从而丢失部分信息 - 其中一些是"切片"程。

如果您希望能够致电method1(),则需要:

  • Hm添加为class X
  • 的成员
  • H*作为成员添加到class X,并将虚拟或纯虚拟method1()添加到class H

如何公开指向python的指针:herehere