C++中(base - >*&Func)()的含义是什么?

Yen*_*nvY 6 c++ polymorphism vtable

这是简单的类定义,如

class Base{
    public:
        virtual void Func(){
            cout<<"Func in Base"<<endl;
        }
 };

 class Derived : public Base{
     public:
         virtual void Func(){
             cout<<"Func in Derived"<<endl;
         }
 }

 Base *b = new Derived();
Run Code Online (Sandbox Code Playgroud)

和声明

 (b->*&Base::Func)();
Run Code Online (Sandbox Code Playgroud)

调用Func的派生版本,不同于b-> Base :: Func(),它按预期调用基本版本,为什么会发生这种情况,这个调用的含义到底是什么?

Jam*_*nze 5

这个电话的意思是增加冗长.基本上:表达式&Base::Func是指向成员函数的指针,并且 (b->*x)()是用于调用由指向x的对象指向的成员函数的语法b.在这种情况下,因为x是一个常数,它与写作大致相同 *&variable.它意味着相同b->Func().

至于为什么它的行为不同b->Base::Func,这是因为它Base::Func是操作&员的操作数,其中Base::有一些不同的作用.如果你写了:

void (Base::*pmf)() = &Base::Func;
Run Code Online (Sandbox Code Playgroud)

并呼吁

(b->*pmf)();
Run Code Online (Sandbox Code Playgroud)

你期望正确调用虚函数.您发布的所有表达式都是用pmf 常量替换变量.


BoB*_*ish 3

&Base::Func
Run Code Online (Sandbox Code Playgroud)

Func意思是“取其中函数的地址Base”。

由于它是一个虚函数,所以它不是一个简单的函数指针,而是实际上将索引存储到虚函数表中。

然后用 调用它->*,这意味着“取消引用并访问此成员”,您将在 的虚拟表中的该索引处获得该函数b,即版本Derived。所以和 基本上是一样的b->Func()

为什么有人要这样做?我不知道!

我之前已经解释过一些关于成员函数指针的内容,在这里(带有图片!)