如何通过使用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)
;
}
错误消息表明它们都不是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将在分发过程中引发“纯虚拟调用”异常。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句