Reihenfolge von Konstruktoren und Destruktoren

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.

Links

  1. Virtueller Destruktor
  2. Initialisierungsliste

Diskussion

Sende ein Kommentar, Frage, Korrekturen, Beschimpfungen...

Name:

Nachricht:


doxapp c++
Zur Übersicht
home