使用Pybind11跳板类重写C++虚方法却始终调用基类实现的问题
问题解决方案
核心问题在于**onStart是const成员函数,你误用了普通的PYBIND11_OVERRIDE宏**,这个宏仅适用于非const的虚函数,对于const虚函数必须使用PYBIND11_OVERRIDE_CONST宏,否则无法正确转发到Python子类的实现。
修改跳板类代码
将PyCollisionResponse中的PYBIND11_OVERRIDE替换为PYBIND11_OVERRIDE_CONST:
class PyCollisionResponse : public CollisionResponse { public: using CollisionResponse::CollisionResponse; void onStart() const override { PYBIND11_OVERRIDE_CONST( void, // 返回类型 CollisionResponse, // 父类 onStart // C++函数名 ); } };
原因解释
PYBIND11_OVERRIDE和PYBIND11_OVERRIDE_CONST是针对不同成员函数类型的宏:
PYBIND11_OVERRIDE:用于非const的虚成员函数PYBIND11_OVERRIDE_CONST:用于const修饰的虚成员函数
你原来的代码中,onStart是const函数,但用了普通的OVERRIDE宏,导致pybind11无法正确找到Python子类中重写的方法,最终 fallback 调用了C++基类的实现。修改宏之后,跳板类的onStart会正确转发到Python子类的onStart方法。
额外验证点
确认你的CollisionEngine中调用onStart时,是通过std::shared_ptr<CollisionResponse>调用的(你当前的代码已经满足),确保多态调用的正确性。
内容的提问来源于stack exchange,提问作者user3093226
相关产品推荐
相关产品推荐

