Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
boostpython:如何调用C++;虚函数 < Python嵌入在C++应用程序中。C++调用Python并将其作为C++对象的参数传递。该对象有一些虚函数,可以是某个派生类的基类。如何让boost::python理解它是一个虚拟函数_C++_Python_Boost Python_Virtual Functions - Fatal编程技术网

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