重写虚函数中传递成员函数指针编译报错,求替代方案
问题分析与解决方案
首先,你遇到的编译器错误核心是语法误用,和虚函数运行时解析没有关系。我们一步步拆解清楚:
错误根源:成员函数指针的写法完全错了
你写的&Real::h()是在调用成员函数h(),然后试图取这个调用返回值(bool类型临时对象)的地址——但临时对象不是左值,自然没有可获取的地址,这才是编译器报错的真正原因。
正确的成员函数指针写法应该是直接取函数本身的地址,不要加括号调用:&Real::h。这个表达式的类型正好匹配你的g函数参数要求的bool (Real::*)()。
修正后的可运行代码示例
调整写法后,完全可以在重写的虚函数里调用成员函数、传递成员函数指针:
class Virtual { public: virtual void f() = 0; }; class Real : public Virtual { public: void f() override { g(&Real::h); // 这里是正确的成员函数指针写法 } private: void g(bool (Real::*p)() ) { // 调用成员函数指针的示例:需要绑定当前对象实例 (this->*p)(); } bool h() { return true; // 示例返回值,可根据需求修改 } };
关于你尝试的其他写法的问题
std::mem_fn(&Real::h()):同样犯了调用h()的错误,正确写法是std::mem_fn(&Real::h),它会把成员函数指针包装成更易用的可调用对象。std::function<bool(void)>(h):非静态成员函数不能直接绑定到std::function,因为它依赖对象实例才能调用。你可以用lambda捕获this来实现:
但如果你的std::function<bool()> func = [this]() { return h(); };g函数原本就设计为接收成员函数指针,还是直接用&Real::h更贴合需求。
纠正你对虚函数的误解
你猜测“虚函数在运行时解析,成员函数指针需编译时确定”是混淆了概念:重写的虚函数f是运行时动态绑定,但在f内部获取&Real::h是编译时就能确定的——h是Real类的非虚成员函数,它的地址在编译阶段就已固定,和f是否是虚函数没有任何冲突。
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

