먼저 상속된 클래스의 '''생성'''과 '''소멸''' 과정을 보자. '''생성자'''는 ''부모 클래스''의 생성자가 먼저 불려지고 ''자식 클래스''의 생성자 순서로 불려지고, '''소멸자'''는 ''자식 클래스''의 소멸자가 먼저 불려지고 나서 ''부모 클래스''의 소멸자가 불려진다. 그런데 다형성을 이용하기 위해 부모 클래스의 포인터로 자식 클래스를 호출할 때, 가상 함수로 정의되어 있지 '''않은''' 자식 클래스의 오버라이딩된 함수를 호출하면 부모 클래스의 멤버 함수가 호출된다. 가상 함수 키워드 `virtual`이 사용되었다면 이것은 자식 클래스에서 재정의될 수 있음을 명시하기 때문에 포인터의 종류에 상관없이 항상 자식 클래스의 메서드가 호출된다. 소멸자도 자식 클래스에서 오버라이딩된 함수라고 볼 수 있기 때문에 만약 부모 클래스 포인터로 객체를 삭제하면 부모 클래스의 소멸자가 호출된다. __따라서 소멸자를 가상 함수로 선언하지 않으면 부모 클래스의 포인터일 경우 자식 클래스의 소멸자는 결코 호출되지 않는다__. 따라서 클래스를 상속 받고 소멸자에서 리소스를 해제하는 경우 반드시 소멸자를 가상 함수로 선언해야 한다. ##> Talk is cheap. Show me the code. - Torvalds, Linus (2000-08-25) ==== 예제 코드 ==== {{{#!gcode #include using namespace std; class classA { public: classA(); virtual ~classA(); }; class classB : public classA { public: classB(); ~classB(); }; classA::classA() { cout << "A" << endl; } classA::~classA() { cout << "~A" << endl; } classB::classB() { cout << "B"<< endl; } classB::~classB() { cout << "~B" << endl; } int main() { cout << "START" << endl; classB *B = new classB; classA *A = B; delete A; return 0; } }}} ---- 결과 1 - classA 소멸자에 `virtual`을 쓰지 않았을 때 {{{ START A B ~A }}} 결과 2 - classA 소멸자에 `virtual`을 사용했을 때 {{{ START A B ~B ~A }}}