派生クラス・オブジェクトの構築順序

C++コンストラクターを使用して派生クラス・オブジェクトを作成する場合、 そのオブジェクトは、次の順番で作成されます。

  1. 基底リストに示されている順序にしたがって、仮想基底クラスが 初期化される。
  2. 宣言に示されている順序にしたがって、非仮想基底クラスが初期化される。
  3. クラス・メンバーは、宣言の順番に (初期化リストでの順番には関係なく) 初期化される。
  4. コンストラクターの本体が、実行される。

次の例は、このことを示しています。

#include <iostream>
using namespace std;
struct V {
  V() { cout << "V()" << endl; }
};
struct V2 {
  V2() { cout << "V2()" << endl; }
};
struct A {
  A() { cout << "A()" << endl; }
};
struct B : virtual V {
  B() { cout << "B()" << endl; }
};
struct C : B, virtual V2 {
  C() { cout << "C()" << endl; }
};
struct D : C, virtual V {
  A obj_A;
  D() { cout << "D()" << endl; }
};
int main() {
  D c;
}

次に、上記の例の出力を示します。

V()
V2()
B()
C()
A()
D()

上記の出力は、型 D のオブジェクトを作成するために、C++ ランタイムがコンストラクターを呼び出す順序をリストしています。

関連参照

IBM Copyright 2003