boostpython:如何调用C++;虚函数 < Python嵌入在C++应用程序中。C++调用Python并将其作为C++对象的参数传递。该对象有一些虚函数,可以是某个派生类的基类。如何让boost::python理解它是一个虚拟函数
考虑以下几点:boostpython:如何调用C++;虚函数 < Python嵌入在C++应用程序中。C++调用Python并将其作为C++对象的参数传递。该对象有一些虚函数,可以是某个派生类的基类。如何让boost::python理解它是一个虚拟函数,c++,python,boost-python,virtual-functions,C++,Python,Boost Python,Virtual Functions,考虑以下几点: 在C++中: 我做错了什么?这里的问题是Boost.Python深度复制您的派生类对象,并在将其转换为Python时将其切分为一个基本对象;没有必要告诉Boost.Python函数是虚拟的,除非您需要在Python中重写它(听起来好像没有) 它做的拷贝是安全的:它确保了对象Python是不会被C++删除的,而Python仍然有引用。它把它切分到Base——我想——因为它对派生的一无所知 我可以想出两种方法来解决这个问题: 为派生的提供一个简单的包装器。Python在将其转换为P
在C++中:
我做错了什么?这里的问题是Boost.Python深度复制您的派生类对象,并在将其转换为Python时将其切分为一个基本对象;没有必要告诉Boost.Python函数是虚拟的,除非您需要在Python中重写它(听起来好像没有)
它做的拷贝是安全的:它确保了对象Python是不会被C++删除的,而Python仍然有引用。它把它切分到
Base
——我想——因为它对派生的一无所知
我可以想出两种方法来解决这个问题:
- 为
派生的
提供一个简单的包装器。Python在将其转换为Python时仍然会复制它,但是当它这样做时,就不会再将它分割成基了
- 为
Base
注册shared\u ptr
转换(通过Register\u ptr\u to_python()
),在shared\u ptr
中创建派生的
实例,并将其作为参数传递给python函数。现在Posith.Python知道C++对象不能在Python对象存在时被删除,因为Python包装器持有一个<代码> SyddypTr> /Cord>引用。
您可以始终放置一个非虚拟转发函数:void Base::doFunc(){this->func();}
,.def(“func”),&Base::doFunc)代码>我希望避免这种开销。。。这不是boost::python的全部功能吗?避免开销…?你需要总结基地-@barak你能更具体一点吗?我尝试了各种形式,但都没能成功。我不想“重写python中的方法”,我只想以多态方式调用一个虚拟函数。
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);
}
def pyentry(baseref):
baseref.func() # here I want Derived::func() to be called