You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 11:11:16