Boost.Python:从C++调用虚函数

0 投票
2 回答
573 浏览
提问于 2025-04-16 22:20

我并不是想要了解如何将虚函数暴露给Python,我想知道如何从C++这边调用这些虚函数。想象一下这个情况……

// ====================
// C++ code
// --------------------

struct Base
{
    virtual void func() {
        cout << "Hello from C++!";
    }
};

BOOST_PYTHON_MODULE(name)
{
    // Expose the class and its virtual function here
}


// ====================
//   Python code
// --------------------

from name import Base

class Deriv(Base):
    def func():
        print('Hello from Python!')

有没有什么建议,能让我获取一个指向派生类型的Base*,这样当我执行base->func()时,就能调用到Python中的函数?Boost的文档只讲了如何将虚函数暴露给Python,而没有说明如何从C++调用它们的重定义。

2 个回答

0

我觉得你只需要调用 extract<Base*>(obj),其中 obj 是一个 python::object 对象。

0

你的方法不能这么简单地使用;你需要给你的Python类加一个包装,这样Python类才能从这个包装中派生出来。在这里,我简单解释了一下它是怎么工作的。所以,要调用C++虚方法的Python重写版本,可以使用 get_override,然后用 () 调用返回的对象。

想看一些代码,可以参考这里,在这里定义了 PredicatePredicateWrap,然后 PredicateWrap真正暴露给Python;调用重写的方法是在这里完成的,但这对用户来说是隐藏的。

撰写回答