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

重写虚函数中传递成员函数指针编译报错,求替代方案

问题分析与解决方案

首先,你遇到的编译器错误核心是语法误用,和虚函数运行时解析没有关系。我们一步步拆解清楚:

错误根源:成员函数指针的写法完全错了

你写的&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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 22:57:30