■デストラクタはバーチャルにする



継承の基底となるクラスを作成するときはデストラクタをバーチャルにする必要があります
基底クラスを変数名とした継承クラスを作成した場合、クラスが破棄される時に継承クラスのデストラクタが動作しません

基底クラスのデストラクタをバーチャルにすることにより、デストラクタがポインタのように振る舞い、クラス破棄時に継承クラスのデストラクタも連動します



▼デストラクタをバーチャルとしないプログラム



#include <stdio.h>

class base{ //基底クラス
public:
	base(){
		printf("base create\n");
	}
	~base(){
		printf("base delete\n");
	}
};

class test : public base{
public:
	test(){
		printf("test create\n");
	}
	~test(){
		printf("test delete\n");
	}
};

int main(){
	base*obj=new test();
	delete obj;
	return 0;
}

▼実行結果

base create
test create
base delete

継承したクラスのデストラクタが呼ばれていないことが確認できます
上記プログラムを修正してデストラクタをバーチャルにします



▼デストラクタをバーチャルにしたプログラム



#include <stdio.h>

class base{ //基底クラス
public:
	base(){
		printf("base create\n");
	}
	virtual ~base(){
		printf("base delete\n");
	}
};

class test : public base{
public:
	test(){
		printf("test create\n");
	}
	~test(){
		printf("test delete\n");
	}
};

int main(){
	base*obj=new test();
	delete obj;
	return 0;
}

▼実行結果

base create
test create
test delete
base delete


継承したクラスのデストラクタが呼ばれていることが確認できます




▲トップページ > Windows と C++