Aufrufreihenfolge von Konstruktoren

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

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.

Siehe auch