首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost python:如何调用C++虚函数

boost python:如何调用C++虚函数
EN

Stack Overflow用户
提问于 2012-05-11 01:36:50
回答 1查看 1.3K关注 0票数 1

我在C++应用程序中嵌入了python。C++调用python并将其作为参数传递给C++对象。该对象具有一些虚函数,并且可以是某个派生类的基类。如何让boost::python理解它是一个虚函数?

请考虑以下几点:

在C++中:

代码语言:javascript
复制
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中:

代码语言:javascript
复制
def pyentry(baseref):
  baseref.func()    # here I want Derived::func() to be called

我在这里做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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引用。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10539373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档