【问题标题】: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】:
调用的意思是增加冗长。基本上:
表达式&Base::Func 是指向成员函数的指针,并且
(b->*x)() 是调用成员函数的语法
在b 指向的对象上由x 指向。在这个
case, 因为x 是一个常数,所以和写的差不多
*&variable。和b->Func()的意思一样。
至于为什么它的行为与b->Base::Func 不同,它是
因为Base::Func 是& 运算符的操作数,其中
Base:: 的作用有些不同。如果你写了:
void (Base::*pmf)() = &Base::Func;
被叫
(b->*pmf)();
您希望虚函数被正确调用。全部
您发布的表达式是替换变量pmf
有一个常数。
【解决方案2】:
&Base::Func
意思是“在Base中取函数Func的地址”。
由于是虚函数,所以不是简单的函数指针,而是实际将索引存入虚函数表中。
然后用->* 调用它,意思是“解除引用并访问这个成员”,你会在b 的虚拟表中获得该索引处的函数,这是Derived 版本。所以和b->Func()基本一样。
为什么有人会这样做?我不知道!
我之前已经解释了一点关于成员函数指针,here (with pictures!)。