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

时间:2013-11-18 17:10:29

标签: 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();

和陈述

 (b->*&Base::Func)();

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

2 个答案:

答案 0 :(得分:5)

电话的意思是增加冗长。基本上: expression &Base::Func是指向成员函数的指针,和 (b->*x)()是调用成员函数的语法 x指向b指向的对象。在这 case,因为x是一个常数,它与写作大致相同 *&variable。它与b->Func()相同。

至于为什么它与b->Base::Func的行为不同,它就是 因为Base::Func&运算符的操作数,其中 Base::的作用有所不同。如果你写了:

void (Base::*pmf)() = &Base::Func;

并致电

(b->*pmf)();

您希望正确调用虚函数。所有 您发布的表达式是替换变量pmf 不变的。

答案 1 :(得分:3)

&Base::Func

表示“在Func”中获取函数Base的地址。

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

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

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

我之前已经解释过一些关于成员函数指针的问题here (with pictures!)