クラスオブジェクトのファイナライズの順序は次のとおりです。
- デストラクタの実行本体
- オブジェクトを破棄します (つまり、データ メンバーに使用されるメモリの割り当てを解除します)。
ここで、派生クラス オブジェクトのファイナライズの順序について尋ねられました。まったく同じだと思いますが、上記の手順を実行した後に、基底クラスのオブジェクトのデストラクタも呼び出されますか?
そうは思いませんが、試験に確実に合格したかったのです。
ご協力いただきありがとうございます :)
クラスオブジェクトのファイナライズの順序は次のとおりです。
ここで、派生クラス オブジェクトのファイナライズの順序について尋ねられました。まったく同じだと思いますが、上記の手順を実行した後に、基底クラスのオブジェクトのデストラクタも呼び出されますか?
そうは思いませんが、試験に確実に合格したかったのです。
ご協力いただきありがとうございます :)
デストラクタは、構築の逆の順序で呼び出されます。これは、派生クラスのデストラクタの後に、基本クラスのデストラクタが自動的に呼び出されることを意味します。
次の例を見てください。
class Foo
{
protected:
SomeType var;
public:
~Foo() {}
};
class Baz : public Foo
{
public:
~Baz()
{
var.doSomething();
}
};
基本クラス Fooのデストラクタがクラス Baz のデストラクタの前に呼び出された場合、オブジェクトvarは破棄され (そのデストラクタは Foo の破棄時に自動的に呼び出されます)、未定義の動作の領域に入ります。
これは、デストラクタがこのように呼び出される理由の簡単で直感的な説明です。