python - 如何使用 Boost Python 将 Python 派生类升级到它的 c++ 基类?

标签 python c++ polymorphism boost-python upcasting

我有一个带有纯虚函数的 C++ 类,我使用 Boost Python 按以下方式包装它:

class Model {
    virtual double Test() = 0;
};
class ModelWrapper : public Model, public boost::python::wrapper<Model> {
    double Test() {
        return this->get_override("Test")(); 
    }     
};
BOOST_PYTHON_MODULE(mymodule)
{
    class_<ModelWrapper, boost::noncopyable>("Model")
        .def("Test, pure_virtual(&Model::Test))
    ;
}

我还有一个 C++ 函数,它需要一个模型对象作为参数:

double MyFunction(Model& m) { 
    return m.Test() 
}

现在我想做的是在 Python 中创建一个派生类,它覆盖 Model::Test 函数但仍然可以传递给 MyFunction。像这样:

from mymodule import *

class NewModel(Model):
    def Test(self):
        return 0.5

m = NewModel()
print(MyFunction(m))

在这种情况下我想打印出 0.5。相反,我收到此错误:

> ArgumentError: Python argument types in
>     mymodule.MyFunction(NewModel) did not match C++ signature:
>     MyFunction(Model {lvalue})

我不确定为了让 NewModel 在需要 Model 的地方可用我错过了哪一步。任何见解将不胜感激。

最佳答案

我需要明确地将“Model.__init__(self)”添加到 NewModel __init__ 函数中。之后一切正常。

关于python - 如何使用 Boost Python 将 Python 派生类升级到它的 c++ 基类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23142173/

相关文章:

javascript - 在 Python 中读取 Javascript 变量

python - 以编程方式创建大型 Excel 工作表

python - MoviePy RuntimeError : imageio. ffmpeg.download() 已被弃用

c++ - 使用 waveInOpen 保存波形文件

c++ - std::vector 类型引用的无效初始化

python - 我可以在数字中插入逗号吗?数字是字符串的一部分

c++ - 智能指针 - 无法替代原始指针的情况

c++ - 如何在静态库中实现单例

C++ 使用一种方法且没有警告地实现不同类型赋值的优雅方法?

php - 合并事件源中的事件