andere verweis so questionVerwirrung in Bezug auf Namen versteckt und virtuelle Funktionen
den Code vor:
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
}
Für Fall 2)
Der Anruf obj->gogo(7)
wird zur Laufzeit aufgelöst.
Seit obj->gogo(7)
ist legal. Es scheint, dass VTable von Derived
enthält ptr zu virtual void gogo(int a)
zu implizieren, die versteckt werden sollen.
Meine Verwirrung, da Namen versteckt verursacht Fall 1) illegal sein, so wie der Anruf in 2) während der Laufzeit aufgelöst wird
a) Ist VTable von Abgeleitet enthält Zeiger auf gogo (int).
b) Wenn a) nicht wahr ist, wird für virtuelle Funktionen Call Resolution geht von Basisklasse Vtable.
@AndersK Die Funktion 'Base :: gogo (int)' ist in der Tat versteckt durch 'Derived :: gogo (int *)'. Aber eine Anweisung "using Base :: gogo;" in der Klasse "Derived" würde dieses spezielle Problem lösen. –
@MichaelWild Ja, ich habe meinen Fehler gesehen. –