Facendo riferimento un altro so questionconfusione per quanto riguarda il nome nascondiglio e funzioni virtuali
Si consideri il codice:
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
}
Per il caso 2)
La chiamata obj->gogo(7)
viene risolto in fase di esecuzione.
Poiché obj->gogo(7)
è legale. Sembra implicare che vtable di Derived
contenga ptr a virtual void gogo(int a)
che avrebbe dovuto essere nascosto.
La mia confusione è, dal nome nascondiglio provoca caso 1) a essere illegale, allora come la chiamata in 2) viene risolto in fase di esecuzione
a) Se vtable di Derivato contiene puntatore a gogo (int).
b) Se a) non è True, la risoluzione delle chiamate per le funzioni virtuali passa a vtable della classe base.
@AndersK La funzione 'Base :: gogo (int)' è effettivamente nascosta da 'Derived :: gogo (int *)'. Ma l'istruzione 'using Base :: gogo;' nella classe 'Derivata' risolverebbe questo particolare problema. –
@ Michaelison, sì, ho visto il mio errore. –