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