virtualデストラクタ
概要
特定条件のデストラクタにはvirtualをつけなければならず、 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をつけなかった場合
上記の内容で、問題のクラスの流れのmain関数では ChildクラスをParentクラスにアップキャストしており、 そのアップキャストしたParentクラスの変数をdeleteしています。 この場合、派生クラスのデストラクタは呼び出されません。 呼び出されない理由はアップキャストの特性が原因です。
① | 派生クラスは基底クラスの情報を全て持っているので、 異なるデータ型であっても、キャストが成功する |
---|---|
② | アップキャストされた派生クラスは基底クラスのメンバしか使用できなくなる |