使用std::function调用基类虚方法却执行派生类方法的问题咨询
问题分析:绑定基类虚方法却调用了派生类实现
你遇到的问题核心在于C++虚函数的动态绑定机制,哪怕你绑定的是基类的成员函数指针,只要绑定的对象是派生类实例,虚函数调用依然会指向派生类的重写版本。
代码里的关键问题点:
- 在
B::username函数中,A::A_ptr()返回的this指针,表面类型是A*,但实际指向的是当前的B对象实例(因为你是在B的成员函数里调用的)。 std::bind(&A::username, A::A_ptr(), std::placeholders::_1)这段代码,绑定的对象是B实例(虽然转成了A*)。当你调用这个std::function时,虚函数的动态绑定会生效:程序会根据对象的实际类型(B)去查找vtable,最终调用B::username,而不是你期望的A::username。
解决方案:显式绕过虚绑定
如果你想强制调用基类A的username方法,可以用lambda表达式显式限定调用,绕过虚函数的动态绑定逻辑:
struct B : public A { void username(const std::string& name) override { // 用lambda显式调用基类版本,不触发虚绑定 std::function<void(const std::string&)> f = [this](const std::string& n) { A::username(n); }; wrapper(f, name); } void wrapper(const std::function<void(const std::string&)>& f, const std::string& s) { f(s); } };
这样修改后,调用f(s)时会直接执行A::username,不会触发派生类的重写版本。
内容的提问来源于stack exchange,提问作者Denis Zlobin
相关产品推荐
相关产品推荐

