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

派生类Lambda中调用基类纯虚函数报错,求解决方案

问题分析与解决方案

首先得明确你遇到的链接错误根源:当你在lambda里写Base::DoSomething(p)时,是在显式调用基类的纯虚函数本身,但纯虚函数在Base类中只有声明没有实现,链接器找不到对应的函数定义,自然就抛出undefined reference错误了。

你的临时 workaround 虽然能解决问题,但确实多此一举——其实只需要调整lambda里的调用方式,就能既简洁又高效地搞定问题:

优化后的解决方案

直接在lambda中调用this->DoSomething(p),去掉Base::的显式前缀:

class Base { 
public: 
    virtual void DoSomething(Parameter* p) = 0; 
}; 

class Test : public Base { 
public: 
    void addFunction() { 
        mFunction = [this] (Parameter* p) { 
            this->DoSomething(p); // 直接调用虚函数,触发动态绑定
        }; 
    } 
private: 
    std::function<void(Parameter* p)> mFunction; 
};

为什么这样可行?

  • this指向的是Test(或它的派生类)的实例,调用DoSomething时会触发C++的动态绑定:程序会通过虚函数表(vtable)找到当前实例实际对应的派生类中实现的DoSomething函数,而不是试图调用基类没有实现的纯虚函数。
  • 这种写法完全贴合多态设计的初衷,没有任何额外开销,比你之前的tempDoSomething方案更简洁优雅。

环境兼容性说明

你使用的Android NDK搭配Clang环境完全支持这种写法,不存在兼容性问题。本质上,你之前的tempDoSomething函数就是做了同样的事情——通过非虚函数间接触发虚函数调用,而直接用this->DoSomething相当于把这个逻辑简化了一步,效果完全一致。

内容的提问来源于stack exchange,提问作者kaiser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:24:40