5

C++ の規則に従って、派生クラス オブジェクトを定義するときに、基本クラス コンストラクターが呼び出されて基本クラス メンバーが初期化され、次に派生クラス コンストラクターが初期化されます。デストラクタの場合、ルールは元に戻ります。

なぜこのルールを守らなければならないのか不思議です。なぜ最初に基本コンストラクターを作成し、次に派生クラス コンストラクターを作成するのですか? これを行う理由はありますか?または、それが c++ の定義だからです。

ありがとう、

4

2 に答える 2

8

派生クラスのメンバーは基本クラスのメンバーに依存する可能性があるため、基本クラスのメンバーを最初に初期化する必要があります。

反対を主張することはできません。

于 2013-02-12T16:33:05.470 に答える
3

クラス型のオブジェクトは、サブオブジェクト (その基本クラスのサブオブジェクトと (非静的) データ メンバー) で構成されます。

サブオブジェクトが構築される前は、その代わりに生の初期化されていないストレージがあり、これをオブジェクトとして使用してはなりません。

オブジェクトのサブオブジェクトは、オブジェクトのコンストラクターの本体が入力される前に構築されるため、これらのサブオブジェクトをコンストラクター本体で使用できます。

基本クラスのサブオブジェクトがメンバーのサブオブジェクトの前に構築されるのは単なる規則ですが、次の観察によって動機付けられる場合があります。

  • 派生オブジェクト基本オブジェクトであり、追加のメンバーと動作を追加します。新しいパーツを追加する前に、まず派生パーツが置かれるベース パーツを作成するのが自然です。
  • 基本クラス サブオブジェクトが構築されると、データ メンバーの初期化を含め、通常のインターフェイスを介して (ポリモーフィック動作を除いて) それを使用できます。逆は真ではありません: 派生オブジェクトが完全に構築されるまで (基本クラスのサブオブジェクトを含む)、派生クラス メンバーに通常の方法 (メンバー関数をカプセル化することによって) にアクセスすることはできません。

この構築順序の技術的な理由は、コンパイラが通常、コンストラクターでポリモーフィズム (vtable ポインター) に必要なデータを初期化するためです。したがって、最初に基本クラスのコンストラクターがそのクラスの this を初期化し、次に派生クラスのコンストラクターが派生クラスのこのデータを上書きします。これは、コンストラクター内の多相関数の動作規則にも対応しています。

于 2013-02-12T16:55:40.433 に答える