【发布时间】:2012-04-16 11:26:45
【问题描述】:
引用另一个so question
考虑代码:
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) 是合法的。似乎暗示 Derived 的 vtable 包含
指向
virtual void gogo(int a) 应该被隐藏了。
我的困惑是,由于名称隐藏导致案例 1) 是非法的,那么如何在运行时解决 2) 中的调用
a) Derived 的 vtable 是否包含指向 gogo(int) 的指针。
b) 如果 a) 不为 True,是否对虚函数的调用解析继续到基类的 vtable。
【问题讨论】:
-
@AndersK 函数
Base::gogo(int)确实被Derived::gogo(int*)隐藏了。但是Derived类中的using Base::gogo;语句可以解决这个特殊问题。 -
@MichaelWild 是的,我看到了我的错误。
标签: c++ virtual overriding name-hiding