ホームページ > バックエンド開発 > C++ > C の継承におけるコンストラクターとデストラクターの呼び出しの順序は何ですか?

C の継承におけるコンストラクターとデストラクターの呼び出しの順序は何ですか?

Mary-Kate Olsen
リリース: 2025-01-05 20:15:43
オリジナル
1006 人が閲覧しました

What's the Order of Constructor and Destructor Calls in C   Inheritance?

継承におけるコンストラクターとデストラクターの呼び出しの順序

継承されたクラスを定義する場合、コンストラクターとデストラクターが呼び出されるシーケンスを理解することが重要です。次の例を考えてみましょう。

struct A {
    A() { cout << "A() C-tor" << endl; }
    ~A() { cout << "~A() D-tor" << endl; }
};

struct B : public A {
    B() { cout << "B() C-tor" << endl; }
    ~B() { cout << "~B() D-tor" << endl; }

    A a;
};
ログイン後にコピー

構築順序:

  1. 基本クラス コンストラクター: 基本クラスのコンストラクター (A ) 派生オブジェクトの基本部分を初期化します。
  2. メンバーフィールド構築: B には型 A のフィールドがあるため、そのコンストラクターはこのフィールドのコンストラクターを呼び出します。
  3. 派生クラス コンストラクター: 最後に、派生クラスのコンストラクター ( B) オブジェクトの初期化が完了します。

したがって、構築の順序は次のようになります。は:

  • A()
  • A(a)
  • B()

破壊命令:

デストラクターは逆の順序で呼び出されます。構築:

  1. 派生クラス デストラクター: 派生クラス (B) のデストラクターは、クリーンアップ プロセスを開始します。
  2. メンバー フィールドの破壊: 型 A (a) のフィールドは破棄されます。
  3. 基本クラスデストラクタ: 最後に、基本クラス (A) のデストラクタによって破壊が完了します。

の破壊順序は:

  • ~B()
  • ~A(a)
  • ~A()

初期化子リスト:

B で明示的な初期化子リストが定義されていない場合でも、デフォルト初期化リストはコンパイラによって自動的に生成されます。このリストは、デフォルトのコンストラクターを使用して基底クラス (A) とメンバー フィールド (a) を初期化します。

結論として、継承におけるコンストラクターとデストラクターの呼び出しの順序は特定の規則に従います。コンストラクターは最初に基底クラスを初期化し、次にコンストラクターを初期化します。メンバーフィールド、そして最後に派生クラスです。デストラクターはクリーンアップ プロセスを逆の順序で呼び出します。継承を使用する場合に堅牢なコードを作成するには、これらのルールを理解することが不可欠です。

以上がC の継承におけるコンストラクターとデストラクターの呼び出しの順序は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート