首页 > 解决方案 > 试图从 pybrind11 调用纯虚函数

问题描述

我正在尝试使用 pybind11 实现一个抽象类。我所拥有的是以下内容:

基类

namespace VNCS
{
class BlendingField : public sofa::core::objectmodel::BaseObject
{
public:
    SOFA_CLASS(BlendingField, sofa::core::objectmodel::BaseObject);
    BlendingField() = default;
    virtual ~BlendingField() = default;

    virtual Real blending(const VNCS::Point_3 &p) const = 0;
};

}  // namespace VNCS

和实施

namespace VNCS
{
namespace py
{
namespace module
{
void blendingField(pybind11::module &m);
}

class BlendingField : public VNCS::BlendingField
{
public:
    SOFA_CLASS(VNCS::py::BlendingField, VNCS::BlendingField);
    BlendingField();
    ~BlendingField() override;

    VNCS::Real blending(const VNCS::Point_3 &p) const final;
};

}  // namespace py
}  // namespace VNCS

具有以下实现

PYBIND11_DECLARE_HOLDER_TYPE(T, sofa::core::sptr<T>, true);

VNCS::py::BlendingField::BlendingField()
    : VNCS::BlendingField()
{
}

VNCS::py::BlendingField::~BlendingField()
{
}

VNCS::Real VNCS::py::BlendingField::blending(const VNCS::Point_3 &p) const
{
    const std::array<double, 3> pyP{p[0], p[1], p[2]};
    PYBIND11_OVERLOAD_PURE(VNCS::Real,          /* Return type */
                           VNCS::BlendingField, /* Parent class */
                           blending,            /* Name of function in C++ (must match Python name) */
                           pyP                  /* Argument(s) */
    )
}

void VNCS::py::module::blendingField(pybind11::module &m)
{
    pybind11::class_<VNCS::BlendingField, sofa::core::objectmodel::BaseObject, sofa::core::sptr<VNCS::BlendingField>>(
        m, "BlendingFieldBase");

    pybind11::class_<VNCS::py::BlendingField, VNCS::BlendingField, sofa::core::sptr<VNCS::py::BlendingField>>(
        m, "BlendingField")
        .def(pybind11::init(
            [](pybind11::args & /*args*/, pybind11::kwargs &kwargs) { return new VNCS::py::BlendingField(); }))
        .def("blending", &VNCS::BlendingField::blending);
}

如果我创建一个 python 文件,加载我的模块,创建一个BlendingField(PyVNCS.BlendingField)并调用blending(self, point),这工作正常,但是如果我使用解释器从 C++ 端调用 python 文件(这发生在另一个库中),获取一个指向混合字段的指针并尝试调用 blending() 虚拟,它失败并出现以下错误:

terminate called after throwing an instance of 'std::runtime_error'
  what():  Tried to call pure virtual function "VNCS::BlendingField::blending"

我不明白为什么会这样,因为调试 C++ 端清楚地表明我进入了 VNCS::py::BlendingField::blending 实现。

这里发生了什么?

标签: pythonc++pybind11

解决方案


推荐阅读