Рассмотрим код:
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
содержит указатель на virtual void gogo(int a)
, который должен был быть скрыт.
Меня смущает то, что сокрытие имени приводит к тому, что случай 1) является незаконным, а затем как вызов в 2) разрешается во время выполнения
а) Содержит ли vtable of Derived указатель на gogo(int).
б) Если а) не верно, разрешение вызовов для виртуальных функций переходит к виртуальной таблице базового класса.
Base::gogo(int)
действительно скрытаDerived::gogo(int*)
. Но операторusing Base::gogo;
в классеDerived
решил бы эту конкретную проблему. - person Michael Wild   schedule 16.04.2012