python - 试图从 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 实现。
这里发生了什么?
解决方案
推荐阅读
- html - html在表格中显示内联文本
- excel - Excel 数据透视功能
- javascript - 从 v2.0 开始,“injectBabelPlugin”助手已被弃用。您可以使用自定义 cra 插件代替
- python - 尽量不在 SQL 查询中硬编码日期范围(Python、SQL 服务器)
- matlab - Simulink Rapid Accelerator 模式编译器错误 Linux CentOS 7.3 undefined reference to `std::__cxx11::basic_string
- node.js - 表格中发送后看到的数据,会是什么?
- c# - 如何传递类型思维方法并返回不同的列表类型
- python - 如何在 C# 中返回 python 脚本的“返回值”?
- java - 如果单选框被选中,则在两种点击方式之间切换
- php - 改变 woocommerce 分页结构