Aufrufreihenfolge der Konstruktoren und Destruktoren

Bei der Konstruktion von Objekten gibt es eine exakt definierte Reihenfolge, in der die Konstruktoren der Basisklassen und der Elemente aufgerufen werden. Gegeben sei folgende Klassendeklaration

class A : public B, public C, public D
  {
    public:
      A() : C(45), b(5.3) {};
    protected:
      int a;
      double b;
    public:
      char c;
  };
Die Aufrufreihenfolge ist dann wie folgt:
  1. Es werden die Konstruktoren der Basisklasse in der Reihenfolge ihrer Deklaration aufgerufen (B()->C()->D())
  2. Die Konstruktoren der Elemente werden ebenfalls in der Reihenfolge ihrer Deklaration aufgreufen (int()->double()->char()).
  3. Schließlich wird der Konstruktor der Klasse selber aufgerufen (A())

Der Aufruf der Konstruktoren der Basisklasse C und des double-Konstruktors mit expliziten Parametern ändert nichts an dieser Reihenfolge.

Die Destruktoren werden später in umgekehrter Reihenfolge aufgerufen.

Ausnahme von dieser Regel sind die sogenannten virtuellen Basisklassen. Existiert eine direkte virtuelle Basisklasse (d.h. eine direkte Basisklasse ist virtuell) oder virtuelle Basisklassen einer direkten oder indirekten Basisklasse, so werden deren Konstruktoren zuerst aufgerufen. Erst danach geht es in der oben beschriebenen Reihenfolge weiter.