指向虚拟函数中成员函数的指针

时间:2020-06-09 10:07:53

标签: c++ pointers virtual member

是否可以从重写的虚拟函数中调用成员函数?编译器告诉我成员函数没有地址(需要一元'&'操作数的左值)。我想做类似的事情:

class Virtual
{
public:
    virtual void f() = 0;
};

class Real : public Virtual
{
public:
    void f() override { g(&Real::h()); }

private:
    void g(bool (Real::*p)() );
    bool h();
};

但是,在f()中,任何成员指针语句都是无效的(&Real::h()std::mem_fn(&Real::h())std::function<bool<void>(h)等),因为它不认为它是l值(即,它没有地址)。我认为原因是虚函数在运行时评估,并且该成员指针必须在编译时评估。然后,还有其他选择吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

该错误消息已经很好地提示了这里出了什么问题:

<source>:10:27: error: cannot take the address of an rvalue of type 'bool'
    void f() override { g(&Real::h()); }
                          ^~~~~~~~~~

Real::h()bool。指向成员函数的指针的正确语法是

    void f() override { g(&Real::h); } 
                           //     ^  -------- no () !!!
相关问题