가상 소멸자가 필요한 이유

2019. 11. 16. 14:30PL/C++

다형성에서 주로 거론이 된다. 주로 자식 클래스인 derived는 누구에게서 만들어졌는지 종종 모를 때가 많다. 따라서 base 클래스의 포인터를 선언해서 자식 클래스를 지정해서 삭제하는 경우가 대부분이다

 

#include <iostream>

using namespace std;

class Base {
public:
	~Base() {
		cout << "Base destructor\n";
	}
};

class Derived : public Base {
private:
	int *arr;

public:
	Derived(int len) {
		arr = new int[len];
	}
	
	~Derived() {
		cout << "Derived destructor\n";
		delete[] arr;
	}
};

int main(void) {
	Derived *d = new Derived(100);
	Base *b = d;

	delete b;
	return 0;
}

 

 

Derived destructor가 먼저 호출되어야 하지만 엉뚱하게 Base destructor만 호출됨을 볼 수 있다. 이를 해결하기 위해서는 virtual키워드를 소멸자 앞에 붙여야만 한다

 

#include <iostream>

using namespace std;

class Base {
public:
	virtual ~Base() {
		cout << "Base destructor\n";
	}
};

class Derived : public Base {
private:
	int *arr;

public:
	Derived(int len) {
		arr = new int[len];
	}
	
	virtual ~Derived() {
		cout << "Derived destructor\n";
		delete[] arr;
	}
};

int main(void) {
	Derived *d = new Derived(100);
	Base *b = d;

	delete b;
	return 0;
}