Aufrufreihenfolge von Konstruktoren
Nach oben zu Konstruktoren - Index
Hat eine Klasse eine oder mehrere Basisklassen, werden die Basisklassen-Konstruktoren vor dem Konstruktor der abgeleiteten Klasse aufgerufen. Die Basisklassen-Konstruktoren werden in der Reihenfolge ihrer Deklaration aufgerufen.
Beispielsweise werden hier,
class Y {...}
class X : public Y {...}
X one;
die Konstruktoren in folgender Reihenfolge aufgerufen:
Y(); // Basisklassenkonstruktor
X(); // abgeleiteter Klassenkonstruktor
Gibt es mehrere Basisklassen,
class X : public Y, public Z
X one;
werden die Konstruktoren in der Reihenfolge ihrer Deklaration aufgerufen:
Y(); // Basisklassenkonstruktoren kommen zuerst
Z();
X();
Konstruktoren für virtuelle Basisklassen werden vor denen für nicht-virtuelle Basisklassen aufgerufen. Sind mehrere virtuelle Basisklassen vorhanden, werden die zugehörigen Konstruktoren in der Reihenfolge ihrer Deklaration aufgerufen. Danach werden die Konstruktoren der nicht-virtuellen Basisklassen aufgerufen, darauf folgen die der abgeleiteten Klasse.
Wurde eine virtuelle Klasse von einer nicht-virtuellen Basisklasse abgeleitet, wird diese zuerst behandelt, um sicherzustellen, dass der Konstruktor der virtuellen Klasse richtig arbeitet. Der Programmteil:
class X : public Y, virtual public Z
X one;
führt zu folgender Reihenfolge:
Z(); // Initialisierung der virtuellen Basisklasse
Y(); // nicht-virtuelle Basisklasse
X(); // abgeleitete Klasse
Ein etwas komplexeres Beispiel:
class base;
class base2;
class level1 : public base2, virtual public base;
class level2 : public base2, virtual public base;
class toplevel : public level1, virtual public level2;
toplevel view;
Die Abarbeitungsreihenfolge für Konstruktoren für view ist wie folgt definiert:
base(); // virtuelle Basisklasse ist die höchste in der Hierarchie
// base wird nur einmal initialisiert
base2(); // die nicht-virtuelle Basis der virtuellen Basis level2
// muss zur Initialisierung von level2 aufgerufen werden
level2(); // virtuelle Basisklasse
base2(); // nicht-virtuelle Basis von level1
level1(); // weitere nicht-virtuelle Basis
toplevel();
Falls eine Klassenhierarchie mehrere Instanzen derselben virtuellen Basisklasse enthält, wird der Konstruktor dieser Basisklasse nur einmal aufgerufen. Existieren jedoch virtuelle und nicht-virtuelle Instanzen der Basisklasse, wird der Klassenkonstruktor einmal für alle virtuellen Instanzen und dann jeweils einmal für jede nicht-virtuelle Instanz der Basisklasse aufgerufen.
Konstruktoren für Elemente eines Arrays werden in aufsteigender Reihenfolge des Index aufgerufen.