boost python: как вызвать виртуальную функцию C ++

У меня есть python, встроенный в приложение на C ++. 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 

Что я здесь делаю неправильно?

One Solution collect form web for “boost python: как вызвать виртуальную функцию C ++”

Проблема здесь в том, что Boost.Python глубоко копирует ваш объект производного класса и разрезает его на базовый объект, когда он преобразует его в Python; нет необходимости сообщать Boost.Python о том, что функция является виртуальной вообще, если вам не нужно переопределять ее в Python (и похоже, что вы этого не делаете).

Это делает эту копию безопасной: она гарантирует, что объект Python не будет удален C ++, в то время как Python все еще имеет ссылку на него. И он нарезает его на Base – я думаю, потому что он ничего не знает о Derived .

Я могу придумать два способа исправить это:

  • Предоставьте тривиальную оболочку для Derived . Boost.Python по-прежнему будет копировать его при преобразовании его в Python, но он не будет нарезать его в Base больше, когда он это сделает.

  • Зарегистрируйте преобразование shared_ptr для Base (через register_ptr_to_python< boost::shared_ptr<Base> >() ), создайте свой Derived экземпляр в shared_ptr и передайте это как аргумент вашей функции Python. Теперь Boost.Python знает, что объект C ++ не может быть удален, если объект Python существует, потому что оболочка Python содержит ссылку shared_ptr на него.

  • почему PyObject * может указывать на любой объект в python?
  • Boost Python Нет to_python для std :: unique_ptr
  • Техника использования std :: ifstream, std :: ofstream в python через SWIG?
  • Прототипирование Qt / C ++ в Python
  • Segfault при попытке вызвать функцию Python из C
  • Питон-эквивалент короткой формы «if» в C ++
  • Как импорт работает с Boost.Python изнутри файлов python
  • Песочница в Linux
  • Python - лучший язык программирования в мире.