C++ の規則に従って、派生クラス オブジェクトを定義するときに、基本クラス コンストラクターが呼び出されて基本クラス メンバーが初期化され、次に派生クラス コンストラクターが初期化されます。デストラクタの場合、ルールは元に戻ります。
なぜこのルールを守らなければならないのか不思議です。なぜ最初に基本コンストラクターを作成し、次に派生クラス コンストラクターを作成するのですか? これを行う理由はありますか?または、それが c++ の定義だからです。
ありがとう、
C++ の規則に従って、派生クラス オブジェクトを定義するときに、基本クラス コンストラクターが呼び出されて基本クラス メンバーが初期化され、次に派生クラス コンストラクターが初期化されます。デストラクタの場合、ルールは元に戻ります。
なぜこのルールを守らなければならないのか不思議です。なぜ最初に基本コンストラクターを作成し、次に派生クラス コンストラクターを作成するのですか? これを行う理由はありますか?または、それが c++ の定義だからです。
ありがとう、
派生クラスのメンバーは基本クラスのメンバーに依存する可能性があるため、基本クラスのメンバーを最初に初期化する必要があります。
反対を主張することはできません。
クラス型のオブジェクトは、サブオブジェクト (その基本クラスのサブオブジェクトと (非静的) データ メンバー) で構成されます。
サブオブジェクトが構築される前は、その代わりに生の初期化されていないストレージがあり、これをオブジェクトとして使用してはなりません。
オブジェクトのサブオブジェクトは、オブジェクトのコンストラクターの本体が入力される前に構築されるため、これらのサブオブジェクトをコンストラクター本体で使用できます。
基本クラスのサブオブジェクトがメンバーのサブオブジェクトの前に構築されるのは単なる規則ですが、次の観察によって動機付けられる場合があります。
この構築順序の技術的な理由は、コンパイラが通常、コンストラクターでポリモーフィズム (vtable ポインター) に必要なデータを初期化するためです。したがって、最初に基本クラスのコンストラクターがそのクラスの this を初期化し、次に派生クラスのコンストラクターが派生クラスのこのデータを上書きします。これは、コンストラクター内の多相関数の動作規則にも対応しています。