Vererbung?
-
Hallo,
ich habe eine Frage zur Vererbung:
Es existiert eine Basisklasse und eine abgeleitete Klasse.
Beide Klassen haben z.B eine Methode void ausgeben () {...}
Wenn ich von einem Objekt der abgeleteten Klasse die Methode ausgeben aufrufe, dann wird ja die Methode aus der abgeleiteten Klasse aufgerufen.
Wenn die Basisklasse (nur die Basisklasse) nun eine Methode void aendern () {...} hat und ich die Methode aendern () von einem Objekt der abgeleiteten Klasse aufrufe, wird natürlich die Methode der Basisklasse aufgerufen.
Aber wie funktioniert das genau:
Wird zuerst in der abgeleiteten Klasse gesucht, ob die gewünschte Methode vorhanden ist und dann in der Basisklasse ob hier die Methode vorhanden ist?
Danke!
Gruß
-
Der Compiler kennt den Typ des Objekts und unterscheidet dann noch zwischen normalen und virtuellen Methoden.
Bei normalen Methoden sucht der Compiler zuerst in der Klasse selber, danach in ihren Basisklassen und nimmt die Methode, die er dabei findet.
Bei virtuellen Methoden kommt noch hinzu, daß die Methode über die vatable aufgerufen wird und dadurch eine Methode einer abgeleiteten Klasse genutzt werden könnte, beispielsweise:class Basis { public: void aendern(); virtual void ausgeben(); }; class Derived : public Basis { public: void aendern(); virtual void ausgeben(); void testen(); } Basis* ptr1 = new Derived; ptr1->aendern(); ptr1->ausgeben(); Derived* ptr2 = new Derived; ptr2->aendern(); ptr2->ausgeben(); ptr2->testen();Bei beiden Aufrufen über ptr1 sucht der Compiler in der Basis-Klasse nach diesen Methoden (wenn er sie dort nicht findet, gibt es einen Fehler, weil es darüber keine weitere Basisklasse gibt in der er suchen könnte). Ein Aufruf
ptr2->testen();würde sich nicht übersetzen lassen. Bei aendern() nimmt er die Methode direkt, bei ausgeben() sucht er sie in der vtable und findet dort die Implementation von Derived.
Bei den Aufrufen über ptr2 sucht der Compiler in der abgeleiteten Klasse und findet dort alle Methoden. aendern() und testen() werden wieder direkt aufgerufen, ausgeben() über die vtable. Wenn ich die Derived::aendern() weglassen würde, würde er sie in der Basisklasse finden und verwenden.