アフィリエイト広告を利用しています

広告

この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
posted by fanblog

2017年12月20日

《その190》 仮想デストラクタ


 仮想デストラクタ

 下記のプログラムで、Bbb は、クラス Aaa から public派生したクラスです。


【下記プログラムをそのまま実行した場合】
 main関数では、
   Aaa* ptr = new Bbb;
として Bbb型オブジェクトを動的に生成し、
   delete ptr;
で、それを破棄しています。

 実行結果を先に示します。
f05_001107.png

 この実行結果から、デストラクタ ~Bbb が呼ばれないままプログラムが終了していることがわかります。
ポインタ ptr の静的な型が Aaa*型なので、Aaa型のデストラクタが呼び出されてしまうのです。
その結果、動的に確保した配列 p 用の領域が解放されないままになってしまいます。


【下記プログラムで、デストラクタ ~Aaa を仮想デストラクタに変更した場合】
 今度は、クラス Aaa のデストラクタを仮想デストラクタにしてみます。
具体的には、下記のプログラムの 部分のコメントアウトを外して、
   virtual ~Aaa();
とするだけです。

 こうすることで、派生クラスのデストラクタ ~Bbb も、仮想デストラクタになります
したがって、クラス Bbb は、仮想関数を含む多相的クラスということになります。
すると、
   delete ptr;
によって呼び出されるのは、動的な型、つまりこの場合は、
ptr が指すオブジェクト型のデストラクタ ~Bbb です。
 この場合の実行結果は次のようになります。
f05_001108.png

 こんどは、終了時に、デストラクタ ~Bbb が呼ばれるので、配列の領域も解放されています。


以下は、プログラムです。

// ------------------------------------
#include <iostream>
using namespace std;

class Aaa {
public:
Aaa() {
cout << "constructor Aaa\n";
}

// virtual //
~Aaa() {
cout << "destructor ~Aaa\n";
}
};

class Bbb : public Aaa {
int* p;
public:
Bbb() {
p = new int[10];
cout << "constructor Bbb\n";
}

~Bbb() {
delete[] p;
cout << "destructor ~Bbb\n";
}
};

int main() {
Aaa* ptr = new Bbb;
delete ptr;
}
// ------------------------------------





新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/11/10 13:13時点)

新版 明解C 中級編 (明解シリーズ)

新品価格
¥2,916から
(2017/11/10 13:14時点)






 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2017年12月 >>
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。