デストラクタのvirtual

■概要l

特定条件のデストラクタにはvirtualをつける必要があります。
virtualをつけ忘れるとデストラクタが呼び出されない状況があります。

■virtualが必要な条件

仮想関数を持っている基底クラスがある場合

●例
	class Parent
	{
	public:
		Parent(){}
		virtual ~Parent() {}

		virtual void Print()
		{
			printf("Parentクラス\n");
		}
	};

	class Child : public Parent
	{
	public:
		Child() {}
		virtual ~Child() {}

		virtual void Print()
		{
			printf("Childクラス\n");
		}
	};

	上記のコードではParentクラスの「Print」関数は仮想関数となっているので、
	基底クラスのデストラクタには「virtual」をつける必要があります。

■virtualをつけなかった場合

cpp_0004

上記の内容ではChildクラスをParentクラスにアップキャストしており、
そのアップキャストした変数をdeleteしているので派生クラスのデストラクタは
呼び出されていません。
呼び出されない理由はアップキャストの特性が原因です。

●アップキャストの特性
	①.派生クラスは基底クラスの情報を全て持っているので、
		  異なるデータ型であっても、キャストが成功する

	②.アップキャストされた派生クラスは基底クラスのメンバしか
		  使用できなくなる

上記の特性の②が主な原因です。
ParentでアップキャストされたChildクラスをdeleteで消去した場合、
Parentのデストラクタが呼び出されます。
本来の派生クラスのデストラクタは派生先から始まり、基底クラスのデストラクタに
たどり着きますので、今回の問題ではいきなり最後のデストラクタが呼ばれた形になります。