当我运行下面的代码时(在VS2013中),结果(也作为评论发布)让我困惑:
class Base {
public:
virtual void foo(){ cout << "in base" << endl; }
virtual void foo(int){ cout << "in base int" << endl; }
};
class Derived : public Base {
public:
virtual void foo(){ cout << "in derived" << endl; }
};
int main() {
Derived *d = new Derived();
Derived d1;
((Base*)d)->foo(); //in derived
((Base*)d)->foo(1); //in base int
((Base)d1).foo(); //in base
((Base)d1).foo(1); //in base int
system("pause");
return 0;
}
对于((Base*)d)->foo(); //in derived
我认为我理解:d->__vptr
指向Devierd
类的vftable。在向上转换之后,地址d->__vptr
指向的地址不会更改,尽管它现在已解析为Base对象而非Derived对象。这个vftable地址中的条目总是Derived :: foo()。所以输出是&#34;在派生&#34;中。如果我理解了,请纠正我。
我认为这也适用于((Base*)d)->foo(1)
,除了vftable中的条目被解析为Base :: foo(int)。但我在这里有一个问题:Derived :: foo()通过名称隐藏隐藏Base :: foo(int),那么为什么foo(int)在向上转换后可以再次访问? base vftable中有两个条目,但是在名称隐藏后派生的vtable中有多少条目?
((Base)d1).foo()
和((Base)d1).foo(1)
我不知道会发生什么。
任何人都可以帮助我吗?感谢。