C++ Grundlagen
In manchen Fällen kann es von entscheidener Bedeutung sein, in welcher Reihenfolge die Konstruktoren oder Destruktoren von Objekten, ihren Basisklassen und Elementen aufgerufen werden. Unter der Vorraussetzung, dass ein C++ Standard konformer Compiler verwendet wird ist diese Abfolge garantiert. Es soll folgendes Beispiel betrachtet werden.
class A { public: A() {cout << "A ctor" << endl;} ~A() {cout << "A dtor" << endl;} }; class B { public: B() {cout << "B ctor" << endl;} ~B() {cout << "B dtor" << endl;} }; class C { public: C() {cout << "C ctor" << endl;} ~C() {cout << "C dtor" << endl;} }; class Base { public: Base() {cout << "Base ctor" << endl;} virtual ~Base() {cout << "Base dtor" << endl;} // [1] A a; }; class Derived : public Base { public: Derived() : c(), b() // [2] { cout << "Derived ctor" << endl; } ~Derived() { cout << "Derived dtor" << endl; } B b; C c; };
Sehen wir uns die Ausgabe eines Programms an, das nur ein Derived Objekt erzeugt.
A ctor Base ctor B ctor C ctor Derived ctor Derived dtor C dtor B dtor Base dtor A dtor
Als erstes ist festzustellen, dass Basisklassenkonstruktoren vor denen der abgeleiteten Klassen aufgerufen werden. Der Konstruktor der Basisklasse ruft hier zunächst den Konstruktor seines Elements a auf und ruft dann den Rumpf des eigenen Konstruktors auf. Danach ruft der Konstruktor von Derived die Konstruktoren seiner Elemente b und c auf, und zwar in der Reihenfolge, in der sie in der Klassendefinition von Derived deklariert wurden! Die Reihenfolge, in der die Konstruktoren in der Initialisierungsliste [2] aufgelistet sind, spielt hier keine Rolle! Gleiches gilt für Aufrufe von Basisklassenkonstruktoren. Die folgende Änderung am Konstruktor von Derived ändert nichts an der Abfolge der Konstruktion.
Derived() : c(), b(), Base() {...}
Zuletzt wird der Rumpf des Konstruktors von Derived abgearbeitet.
Die Destruktoren werden in der genau umgekehrten Reihenfolge aufgerufen; Basisklasse nach abgeleiteter Klasse, Klassenelemente jeweils in umgekehrter Reihenfolge.
Sende ein Kommentar, Frage, Korrekturen, Beschimpfungen...
doxapp c++ Zur Übersicht home