pybind11 中受保护的虚拟析构函数

阿莱克图

我想与第三方库中的类绑定。该类有一些纯虚函数,但析构函数是受保护的和虚函数。

为了绑定类,我必须编写一个派生类来覆盖纯虚函数(https://pybind11.readthedocs.io/en/stable/advanced/classes.html

所以代码是这样的

class Parent {  
  public:  
    virtual void foo() = 0;
  protected:
    virtual ~ Parent() //Dtor
    {
    }
};

class PyParent : public Parent 
{
  public:
    void foo () override {
        PYBIND11_OVERLOAD_PURE(
            void,
            Parent,
            foo
        );
    }
};

void init(py::module & m) {
    py::class_<Parent, PyParent> p(m, "p");
}

但是由于基类的析构函数被声明为protected,所以抛出以下错误

error: ‘virtual Parent::~Parent()’ is protected
         virtual ~ Parent() //Dtor

我无法修改基类,因为它是第三方库。

任何想法用 pybind11 绑定类?

谢尔盖

std::unique_ptr并且std::shared_ptr是 pybind 开箱即用支持的智能指针。它们都要求析构函数是公开的。

最简单的解决方案是使用公共析构函数编写中间类并使用 pybind11 公开它。

...
class DeletableParent : public Parent{
public:
  ~DeletableParent() override = default;
};
...
py::class_<DeletableParent, PyParent> p(m, "p");

所以你所有的 Python 类都将继承自 DeletableParent

如果您只想在 Python 端创建父派生类,则此解决方案很好。

如果您想公开一个没有DeletableParent作为其基础之一的C++ 父派生类,您会发现在公开这种不同的继承关系时会遇到困难。

另一种选择是编写自己的智能指针,它不会调用所持有指针的析构函数。但它看起来像是通往内存泄漏的直路。

更新:我忽略了 pybind11 文档中已经涵盖了这个特定问题:https ://pybind11.readthedocs.io/en/stable/advanced/classes.html#non-public-destructors

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章