问题描述
我正在尝试使用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字段的指针,然后尝试虚拟调用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实现。
这是怎么回事?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)