当参数为std::function类型时,如何调用基类的set_handler方法?
解决方案
1. 强制调用基类的set_handler方法
可以通过显式指定作用域的方式,直接调用基类a中的方法,有两种可行写法:
方法一:使用作用域限定符
obj_b.a::set_handler(&x_handler_impl);
这种写法直接明确告知编译器调用a类的set_handler版本,绕过子类b的同名方法。
方法二:转换为基类引用
static_cast<a&>(obj_b).set_handler(&x_handler_impl);
将obj_b转换为a的引用后,编译器会匹配基类的方法签名。
2. 更优雅的重载解决方案(推荐)
在子类b中添加using声明,把基类的set_handler方法引入子类作用域,让编译器能根据参数类型自动匹配正确的重载版本:
class b : public a { private: y_handler handler_; public: using a::set_handler; // 引入基类的set_handler重载 y_handler set_handler(y_handler handler) { handler_.swap(handler); return handler; } // 其他方法保持不变 };
修改后,main中直接调用obj_b.set_handler(&x_handler_impl)会自动匹配a类的版本,传入y_handler类型参数时则匹配b类的版本,无需显式限定作用域。
为什么之前的强制转换无效?
子类b的set_handler方法隐藏了基类a的同名方法(即使参数类型不同)。编译器查找obj_b.set_handler时,只会在b的作用域中搜索,找到b::set_handler(y_handler)后就停止查找基类,因此即使将参数强制转换为x_handler,也无法匹配b的方法签名,导致编译错误。
内容的提问来源于stack exchange,提问作者PKP
相关产品推荐
相关产品推荐

