boost python中的多个派生类使用纯虚函数

时间:2013-11-01 13:25:28

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

如何使用boost python将纯虚函数用于多重不兼容。我得到的错误是'Derived1'不能实现抽象类。并且'Derived2'无法实例化抽象类。如果只有一个派生类但多个派生类不起作用,则此代码正常工作。谢谢你的帮助。

class Base
{
  public:
   virtual int test1(int a,int b) = 0;
   virtual int test2 (int c, int d) = 0;
   virtual ~Base() {}
 };

class Derived1
  : public Base
 {
   public:
   int test1(int a, int b) { return a+b; }
};

class Derived2
 : public Base
{
  public:
  int test2(int c, int d) { return c+d; }
};
struct BaseWrap
  : Base, python::wrapper<Base>
{
  int test1(int a , int b) 
  {
     return this->get_override("test")(a, b);
   }
  int test2(int c ,int d)
   {
     return this->get_override("test")(c, d);
    }
};

BOOST_PYTHON_MODULE(example) 
{
  python::class_<BaseWrap, boost::noncopyable>("Base")
   .def("test1", python::pure_virtual(&BaseWrap::test1))
   .def("test2", python::pure_virtual(&BaseWrap::test2))
   ;

  python::class_<Derived1, python::bases<Base> >("Derived1")
   .def("test1", &Derived1::test1)
   ;

   python::class_<Derived2, python::bases<Base> >("Derived2")
   .def("test2", &Derived2::test2)
   ;   
}

1 个答案:

答案 0 :(得分:2)

错误消息表明Derived1Derived2都不能实例化,因为它们是抽象类:

  • Derived1有一个纯虚函数:int Base::test2(int, int)
  • Derived2有一个纯虚函数:int Base::test1(int, int)

当通过boost::python::class_公开其中任何一个时,应该发生编译器错误。 class_HeldType默认为公开的类型,HeldType是在Python对象中构造的。因此,python::class_<Derived1, ...>将实例化Boost.Python模板,这些模板尝试创建动态类型为Derived1的对象,从而导致编译器错误。

此错误不会出现BaseWrap,因为BaseWrap实现了所有纯虚函数。 boost::python::pure_virtual()函数指定如果函数未在C ++或Python中被覆盖,Boost.Python将在调度期间引发“纯虚拟调用”异常。