58

C++ でデストラクタとコンストラクタが呼び出される順序は何ですか? いくつかの基本クラスと派生クラスの例を使用する

4

5 に答える 5

74

順序は次のとおりです。

  1. ベースコンストラクター
  2. 派生コンストラクタ
  3. 派生デストラクタ
  4. ベースデストラクタ

例:

class B
{
public:
  B()
  {  
    cout<<"Construct B"<<endl;
  }

  virtual ~B()
  {
    cout<<"Destruct B"<<endl;
  }
};

class D : public B
{
public:
  D()
  {  
    cout<<"Construct D"<<endl;
  }

  virtual ~D()
  {
    cout<<"Destruct D"<<endl;
  }
};



int main(int argc, char **argv)
{
  D d; 
  return 0;
}

例の出力:

コンストラクト B

コンストラクト D

デストラクトD

破壊B

複数レベルの継承はスタックのように機能します。

アイテムを構築としてスタックにプッシュし、破壊として削除することを検討すると、スタックのように複数レベルの継承を見ることができます。

これは、任意の数のレベルで機能します。

例 D2 は D から派生し、B から派生します。

B をスタックにプッシュし、D をスタックにプッシュし、D2 をスタックにプッシュします。したがって、構築順序は B、D、D2 です。次に、破壊順序を調べるためにポップを開始します。D2、D、B

より複雑な例:

より複雑な例については、@JaredPar が提供するリンクを参照してください。

于 2009-03-17T14:13:23.930 に答える
22

仮想および多重継承を含むこれらのイベントの詳細な説明は、C++ FAQ Lite で入手できます。セクション 25.14 および 25.15

https://isocpp.org/wiki/faq/multiple-inheritance#mi-vi-ctor-order

于 2009-03-17T14:16:04.077 に答える
10

また、配列要素は最初 -> 最後に構築されますが、逆の順序で破棄されることに注意してください: 最後 -> 最初。

于 2009-03-17T14:33:58.090 に答える