C++ でデストラクタとコンストラクタが呼び出される順序は何ですか? いくつかの基本クラスと派生クラスの例を使用する
41906 次
5 に答える
74
順序は次のとおりです。
- ベースコンストラクター
- 派生コンストラクタ
- 派生デストラクタ
- ベースデストラクタ
例:
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 に答える