Ich implementiere ein Pybind11 -Modul und habe Python eine C ++ - Klasse aus, damit es unterklassifiziert werden soll. Ich folge dem, was hier beschrieben wird (
https://pybind11.readthedocs.io/en/stab ... seses.html) und unten ist der Code für die C ++ - Basis- und Trampolinklasse.
Code: Select all
class CollisionResponse {
public:
CollisionResponse() : _tag1(0), _tag2(1) {}
virtual ~CollisionResponse() = default;
virtual void onStart() const {
std::cout
Unten ist, wie ich die Klasse Python aussetzt: < /p>
py::class_(m, "CollisionResponse")
.def(py::init())
.def("onStart", &CollisionResponse::onStart);
Jetzt habe ich ein C ++ - Objekt, das eine Karte von CollisionResponse Objekten enthält, die über die AddResponse -Methode aus Python
übergeben werden:
Code: Select all
class CollisionEngine:
...
void addResponse(std::shared_ptr response) {
_response.insert({std::make_pair(response->getTag1(), response->getTag2()), response});
}
std::unordered_map _response;
< /code>
Last aber nicht zuletzt ist der Python -Code: < /p>
class TestCollision(example.CollisionResponse):
def onStart(self):
print('derived class')
...
cr = CollisionResponse()
cr.addResponse(TestCollision())
Jetzt habe ich in der Klasse collisionEngine eine Methode, mit der die OnStart -Methode aus der CollisionResponse -Objekte aufruft, die in _Response gespeichert sind. Unabhängig davon, was passiert, wird die Basisimplementierung immer aufgerufen. In Debug kann ich sehen, dass die PycollisionResponse :: onStart aufgerufen wird, aber dann geht die Ausführung in die CollisionResponse :: onStart und nicht in der Python testcollision.onstart.>