Bei der Vererbung wird bei der Instanziierung einer abgeleiteten Klasse (Erstellung der abgeleiteten Klasse obj) zunächst Speicher beiseite gestellt. Danach wird der Konstruktor der abgeleiteten Klasse aufgerufen.
class Base
{
public:
int m;
Base(int x=0)
: m(x)
{
}
};
class Derived: public Base
{
public:
double n;
Derived(double y=0.0)
: n(y)
{
}
};
Im obigen Beispiel wird beim Erstellen eines abgeleiteten Klassenobjekts der Konstruktor der abgeleiteten Klasse aufgerufen.
Das Problem ist, dass der Konstruktor der Basisklasse aufgerufen wird, bevor der Konstruktor der abgeleiteten Klasse aufgerufen wird, soweit ich weiß. Es gibt jedoch nirgendwo in der abgeleiteten Klasse eine ausdrückliche Anweisung, zuerst den Konstruktor der Basisklasse aufzurufen. Woher weiß der Compiler, dass der Basisklassenkonstruktor zuerst ausgeführt werden muss? ????
Ich dachte, die Antwort würde in dieser Zeile in der Deklaration der Basisklasse liegen:
class Derived: public Base
Das Problem ist jedoch, dass wir durch die Änderung der abgeleiteten Klasse wie folgt sicherstellen können, dass der Konstruktor der Basisklasse aufgerufen und initialisiert wird, bevor der Körper des abgeleiteten Konstruktors ausgeführt wird.
class Derived: public Base
{
public:
double n;
Derived(double y=0.0, int z=0)
: Base(z), n(y)
{
}
};
Das Problem ist also, dass es im ersten Beispiel keine Anweisung gab, den Basisklassenkonstruktor zuerst aufzurufen, obwohl er tatsächlich zuerst aufgerufen wird, im zweiten geänderten Beispiel sage ich dem Compiler, dass er zuerst zum Basisklassenkonstruktor gehen soll. Weiß er nicht bereits, dass er zuerst zum Basisklassenkonstruktor gehen soll? Worin besteht der Unterschied in der Ausführung zwischen den beiden Beispielen und was sind die Schritte?
Herzliche Grüße,