参考另一个so问题
考虑代码:
class Base {
public:
virtual void gogo(int a){
printf(" Base :: gogo (int) \n");
};
virtual void gogo(int* a){
printf(" Base :: gogo (int*) \n");
};
};
class Derived : public Base{
public:
virtual void gogo(int* a){
printf(" Derived :: gogo (int*) \n");
};
};
int main(){
// 1)
Derived * obj = new Derived ;
obj->gogo(7); // this is illegal because of name hiding
// 2)
Base* obj = new Derived ;
obj->gogo(7); // this is legal
}
对于案例 2)
调用obj->gogo(7)
在运行时解决。
既然obj->gogo(7)
是合法的。这似乎暗示 vtable of包含应该隐藏的Derived
ptr
。virtual void gogo(int a)
我的困惑是,由于名称隐藏导致案例 1) 是非法的,那么如何在运行时解决 2) 中的调用
a) Derived 的 vtable 是否包含指向 gogo(int) 的指针。
b) 如果 a) 不为真,对虚函数的调用解析是否继续到基类的 vtable。