如何使用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)
;
}
答案 0 :(得分:2)
错误消息表明Derived1
和Derived2
都不能实例化,因为它们是抽象类:
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将在调度期间引发“纯虚拟调用”异常。