1

如何使用 boost python 在派生类中调用纯虚函数。我得到的错误是无法实例化抽象基类。示例代码如下:

class Base
{
public: 
    virtual int test() = 0;
};

class Derived : public Base
{
public:
    int  test()
    {
        int  a = 10;
        return a;
    }
};

struct  BaseWrap : Base, wrapper<Base>
{
    Int  test() 
    {
        return this->get_override(“test”)();
    }
};

BOOST_PYTHON_MODULE(Pure_Virtual) 
{
    Class_<BaseWrap, boost::noncopyable>(“Base”, no_init)
    .def(“test”, pure_virtual($Base::test)
    ;

    Class_<Derived, bases<Base> >(“Derived”)
    .def(“test”, &Derived::test)
    ;   
}
4

1 回答 1

1

纯虚函数的调用方式与非纯虚函数相同。唯一的区别是作为纯虚拟 Python 方法公开的函数RuntimeError在调用时会引发 a。

最初发布的代码存在各种语法问题,因此很难准确识别问题所在。但是,这是一个基于原始代码的完整示例:

#include <boost/python.hpp>

namespace python = boost::python;

class Base
{
public:
  virtual int test() = 0;
  virtual ~Base() {}
};

class Derived
  : public Base
{
public:
  int test() { return 10; }
};

struct BaseWrap
  : Base, python::wrapper<Base>
{
  int test() 
  {
    return this->get_override("test")();
  }
};

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

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

及其用法:

>>> import example
>>> derived = example.Derived()
>>> derived.test()
10
>>> class Spam(example.Base):
...     pass
... 
>>> s = Spam()
>>> s.test()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: Pure virtual function called
>>> class Egg(example.Base):
...     def test(self):
...         return 42
... 
>>> e = Egg()
>>> e.test()
42

当在继承自但未实现方法test()的类型上调用时,Boost.Python 将引发一个表示已调用纯虚函数的方法。因此,在一个对象上引发一个异常,而在一个对象上被正确调度。example.Basetest()RuntimeErrortest()Spamtest()Egg

于 2013-10-28T20:03:02.117 回答