我在C++应用程序中嵌入了python。C++调用python并将其作为参数传递给C++对象。该对象具有一些虚函数,并且可以是某个派生类的基类。如何让boost::python理解它是一个虚函数?
请考虑以下几点:
在C++中:
class Base {
public:
virtual void func();
}
class Derived {
public:
virtual void func();
}
BOOST_PYTHON_MODULE(module_api) {
class_<Base>("Base")
.def("func", &Base::func); // ?? what should I put here?
}
int main() {
//... initialization
Derived derived;
main_namespace["pyentry"](&derived);
}在python中:
def pyentry(baseref):
baseref.func() # here I want Derived::func() to be called我在这里做错了什么?
发布于 2012-05-13 07:23:56
这里的问题是,Boost.Python会深度复制派生类对象,并在将其转换为Python时将其分割为基对象;根本不需要告诉Boost.Python某个函数是虚的,除非您需要在Python语言中覆盖它(听起来好像不需要)。
它这样做是为了安全:它确保Python提供的对象不会被C++删除,而Python仍然有对它的引用。它把它切成了Base --我想--因为它对Derived一无所知。
我可以想到两种方法来解决这个问题:
Derived提供了一个简单的包装器。Base注册一个shared_ptr转换(通过register_ptr_to_python< boost::shared_ptr<Base> >()),在shared_ptr中创建你的Derived实例,并将其作为参数传递给你的Python函数。现在Boost.Python知道C++对象存在时不能被删除,因为Python包装器持有对它的shared_ptr引用。https://stackoverflow.com/questions/10539373
复制相似问题