Pybind11, не найдите чистый вызов виртуальной функции при создании экземпляра, полученного из питона, через обратный вызPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Pybind11, не найдите чистый вызов виртуальной функции при создании экземпляра, полученного из питона, через обратный выз

Сообщение Anonymous »

При создании класса, полученного из Python, из базового класса C ++ (с чистой виртуальной функцией) через обратный вызов переопределение Python не вызывается. Вместо этого программа пытается вызвать чистую виртуальную функцию (a :: go), что приводит к ошибке времени выполнения и ошибке сегментации. < /P>
Ожидаемое поведение:
Следует вызвать переопределенный метод Python (например, pyderiveda.go), создавая ожидаемый результат (например, «pyderiveda go go!». /> Обратный вызов возвращает экземпляр класса, полученного из Python, но из-за неправильного преобразования объект теряет свои привязки переопределения Python. Когда выполняется Myrun :: run, он вызывает чистую виртуальную функцию A :: Go, запускает ошибку времени выполнения и ошибку сегментации. < /P>
#include
#include // 支持 std::function 类型
#include
#include
#include
#include
#include
namespace py = pybind11;

class A {
public:
A() { std::cout go();
}
};

PYBIND11_MODULE(example, m) {
m.doc() = "pybind11 包装 MyFactory 和 MyRun 示例";

py::class_(m, "A")
.def(py::init())
.def("go", &A::go);

py::class_(m, "MyFactory")
.def_static("instance", &MyFactory::Instance, py::return_value_policy::reference)
.def("registry", &MyFactory::Registry)
.def("create", &MyFactory::Create);

// 包装 MyRun
py::class_(m, "MyRun")
.def(py::init())
.def("run", &MyRun::Run);
}

import example
class PyDerivedA(example.A):
def __init__(self):
super().__init__()
print("111111111111111111")

def go(self):
print("PyDerivedA go called!")

def create_derived(name):
return PyDerivedA()

factory = example.MyFactory.instance()
factory.registry("derived", create_derived)

runner = example.MyRun()
runner.run("derived") # 输出 "PyDerivedA go called!"

Traceback (most recent call last):
File "/home/mi/fc4tdisk/code/pybind11/build/test.py", line 19, in
runner.run("derived") # 输出 "PyDerivedA go called!"
RuntimeError: Tried to call pure virtual function "A::go"


Подробнее здесь: https://stackoverflow.com/questions/795 ... ived-insta
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»