派生类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
相关产品推荐
相关产品推荐

