Refiriéndose otra so questionconfusión en cuanto a nombre de su escondite y funciones virtuales
Considere el código:
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
}
Para el caso 2)
La llamada obj->gogo(7)
se resuelve en tiempo de ejecución.
Desde obj->gogo(7)
es legal. Parece implicar que vtable de Derived
contiene ptr a virtual void gogo(int a)
que debería haberse ocultado.
Mi confusión es, puesto que el nombre escondite hace caso 1) que es ilegal, entonces, ¿cómo la llamada en 2) se resuelve en tiempo de ejecución
a) ¿vtable del Derivado contiene puntero a gogo (int).
b) Si a) no es Verdadero, ¿la resolución de llamada para funciones virtuales pasa a vtable de clase base.
@AndersK La función 'Base :: gogo (int)' está de hecho oculta por 'Derived :: gogo (int *)'. Pero una instrucción 'using Base :: gogo;' en la clase 'Derived' resolvería este problema en particular. –
@MichaelWild sí, vi mi error. –