私はC++プログラミング言語に不慣れで、継承でコンストラクターを呼び出す順序について混乱しています。私の質問は、コンストラクタとデストラクタが派生クラスに継承されていない場合でも、派生クラスオブジェクトを作成するときに基本クラスコンストラクタが呼び出す理由です。
1 に答える
コンストラクターの目的は、データメンバーを初期化する方法を定義することです。派生クラスは基本クラスからデータメンバーを継承するため、派生クラスのコンストラクターは、派生クラスに固有のデータメンバーだけでなく、基本クラスからのデータメンバーを初期化する方法も定義する必要があります。
これを行う自然な方法(およびC ++標準で必要)は、基本クラスのコンストラクターを呼び出すことです。派生クラスコンストラクターの初期化リストに特定のコンストラクター呼び出しを含めない場合、基本クラスのデフォルトコンストラクターが基本クラスメンバーの初期化に使用されます。
struct base
{
int _i; // a data member
base():_i(0) {} // default constructor
base(int i):_i(i) {} // special constructor
};
struct derived : base
{
int _j; // a data member specific to the derived class
derived(int i, int j):_j(j) {} // user-defined constructor for the derived class
};
上記の例は、派生クラスコンストラクターがそのメンバーを初期化する方法を示していますが、基本クラスからのメンバーは、基本クラスコンストラクターを使用して初期化する必要があります_j
。_i
上記のように、デフォルトのコンストラクターbase::base()
はコンパイラーによって自動的に呼び出されます。つまり、_i
0に初期化されます。
ただし、特定のコンストラクターへの呼び出しを含めることで、その動作を変更できます。
struct derived : base
{
int _j;
derived(int i, int j):base(i),_j(j) {} // user-defined constructor for the derived class
};
コンストラクター呼び出しの順序は次のとおりです。最初に基本クラスのコンストラクター呼び出し、次に派生クラス固有のメンバーの初期化子。派生クラスは、ある意味で基本クラスの拡張であり、派生クラスオブジェクトの基本クラス部分が最初に存在すると見なすのは理にかなっているため、これは当然のことです。