【问题标题】:what's the meaning of (base->*&Func)() in C++C++ 中 (base->*&Func)() 是什么意思
【发布时间】:2013-11-18 17:10:28
【问题描述】:

这是简单的类定义,例如

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的Derived版本,不同于按预期调用基本版本的b->Base::Func(),为什么会发生这种情况以及该调用的确切含义是什么?

【问题讨论】:

标签: c++ polymorphism vtable


【解决方案1】:

调用的意思是增加冗长。基本上: 表达式&amp;Base::Func 是指向成员函数的指针,并且 (b-&gt;*x)() 是调用成员函数的语法 在b 指向的对象上由x 指向。在这个 case, 因为x 是一个常数,所以和写的差不多 *&amp;variable。和b-&gt;Func()的意思一样。

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

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

被叫

(b->*pmf)();

您希望虚函数被正确调用。全部 您发布的表达式是替换变量pmf 有一个常数。

【讨论】:

    【解决方案2】:
    &Base::Func
    

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

    由于是虚函数,所以不是简单的函数指针,而是实际将索引存入虚函数表中。

    然后用-&gt;* 调用它,意思是“解除引用并访问这个成员”,你会在b 的虚拟表中获得该索引处的函数,这是Derived 版本。所以和b-&gt;Func()基本一样。

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

    我之前已经解释了一点关于成员函数指针,here (with pictures!)

    【讨论】:

    • 闻起来像个面试题
    猜你喜欢
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 2011-06-18
    • 2011-11-14
    • 2013-03-09
    • 2012-02-15
    • 2017-01-05
    相关资源
    最近更新 更多