这是简单的类定义,如
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(),它按预期调用基本版本,为什么会发生这种情况,该调用的含义到底是什么?
答案 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!)。