在boost.python中使用抽象类时,无法在抽象类中使用纯虚拟函数 我尝试用我的C++库扩展Python,我遇到了一些特殊的情况:假设有一个抽象类叫做“代码>形状现在我想允许Python从形状继承,基本上实现它自己的代码>形状而且还可以使用C++中的一些现有的形状实现。让我展示一些代码: class Shape { public: virtual inline double get_area() const = 0; }; 伟大,现在我们假设有一个C++类叫做圆< /代码> .< class Circle : public Shape { public: Circle() = default; inline double get_area() const override { return 0.5; } }

在boost.python中使用抽象类时,无法在抽象类中使用纯虚拟函数 我尝试用我的C++库扩展Python,我遇到了一些特殊的情况:假设有一个抽象类叫做“代码>形状现在我想允许Python从形状继承,基本上实现它自己的代码>形状而且还可以使用C++中的一些现有的形状实现。让我展示一些代码: class Shape { public: virtual inline double get_area() const = 0; }; 伟大,现在我们假设有一个C++类叫做圆< /代码> .< class Circle : public Shape { public: Circle() = default; inline double get_area() const override { return 0.5; } },python,c++,boost,polymorphism,boost-python,Python,C++,Boost,Polymorphism,Boost Python,好的,让我们为Shape(版本1)编写一个包装器: 然后定义形状,如下所示: class_<ShapeWrap, boost::noncopyable>("Shape") .def("get_area", pure_virtual(&ShapeWrap::get_area)); 现在,如果我在Shape类中使get_area返回0.0作为默认行为,那么所有这些问题都会得到解决,但我不想这样编写API只是为了支持Python,我想有一个默认函数,当函数不可用时

好的,让我们为
Shape
(版本1)编写一个包装器:

然后定义
形状
,如下所示:

class_<ShapeWrap, boost::noncopyable>("Shape")
        .def("get_area", pure_virtual(&ShapeWrap::get_area));

现在,如果我在
Shape
类中使
get_area
返回0.0作为默认行为,那么所有这些问题都会得到解决,但我不想这样编写API只是为了支持Python,我想有一个默认函数,当函数不可用时,只返回Python 0,因为抽象类的概念在Python中不以同样的方式存在,这很好,但之后我将得到形状>代码>作为C++ C++其余部分的抽象类。有什么方法可以做到这一点吗?

多亏了@llonesmiz,我意识到问题在于包装器函数被传递给了纯虚拟的函数。以这种方式定义
ShapeWrapper
可以解决以下问题:

class_<ShapeWrap, boost::noncopyable>("Shape")
    .def("get_area", pure_virtual(&Shape::get_area));
类(“形状”)
.def(“get_area”,纯虚拟(&Shape::get_area));

查看文档中如何处理
struct P
。PS:它也在,但你可能错过了,因为它非常接近MSVC 6/7解决方案。哇,你完全正确,我的错误是我把包装器函数传递给了纯虚拟函数。现在很有魅力。你应该做出这样的回答,这样我就可以把它标记为一个答案@Llonesmiziz。请你自己这样做,我会投票给你。只要你有能力,别忘了接受这个答案。
struct ShapeWrap : public Shape, public wrapper<Shape>{
   inline double get_area() const override {
      if (auto py_func = this->get_override("get")) return py_func();
      return 0.0;
   }
};
class_<ShapeWrap, boost::noncopyable>("Shape")
        .def("get_area", pure_virtual(&ShapeWrap::get_area));
Boost.Python.ArgumentError: Python argument types in
    Shape.get_area(Circle)
did not match C++ signature:
    get_area(ShapeWrap {lvalue})
    get_area(ShapeWrap {lvalue})
class_<ShapeWrap, boost::noncopyable>("Shape")
    .def("get_area", pure_virtual(&Shape::get_area));