コンストラクタの呼び出し順序
コンストラクタ:インデックス への移動
クラスが 1 つあるいは複数の基本クラスを持つ場合,基本クラスコンストラクタは,派生クラスのコンストラクタより前に呼び出されます。基本クラスのコンストラクタは,宣言された順に呼び出されます。
たとえば次のような設定では,
class Y {...}
class X : public Y {...}
X one;
コンストラクタは次の順で呼ばれます。
Y(); // 基本クラスのコンストラクタ
X(); // 派生クラスのコンストラクタ
基本クラスが次のように複数の場合,
class X : public Y, public Z
X one;
コンストラクタは宣言された順に呼ばれます。
Y(); // 基本クラスのコンストラクタが先
Z();
X();
仮想基本クラスのコンストラクタは,非仮想基本クラスのコンストラクタより前に呼び出されます。複数の仮想基本クラスを含む階層の場合,仮想基本クラスのコンストラクタは,宣言された順に呼び出されます。そして,すべての非仮想基本クラスは,派生クラスコンストラクタが呼び出される前に構築されます。
仮想クラスが非仮想基本クラスから派生している場合,仮想基本クラスが正しく構築されるように,その非仮想基本クラスが最初に構築されます。次のコードでは,
class X : public Y, virtual public Z
X one;
順序は次のようになります。
Z(); // 仮想基本クラスの初期化
Y(); // 非仮想基本クラス
X(); // 派生クラス
次に,やや複雑な例を示します。
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;
view の構築順序は次のとおりです。
base(); // 階層中で最上位の仮想基本クラス
// base は 1 回だけ構築される
base2(); // 仮想基本クラス level2 の非仮想基本クラスは
// level2 を構築するために呼び出されなければならない
level2(); // 仮想基本クラス
base2(); // level1 の非仮想基本クラス
level1(); // ほかの非仮想基本クラス
toplevel();
クラス階層が仮想基本クラスの複数のインスタンスを含む場合,その基本クラスは 1 回だけ構築されます。しかし,その基本クラスの仮想および非仮想インスタンスの両方が存在する場合,クラスコンストラクタは,全仮想インスタンスに対して 1 回,非仮想インスタンスの発生ごとに 1 回ずつ呼び出されます。
配列の要素のコンストラクタは,添え字の増加順に呼び出されます。