C++에서 소멸자에 virtual을 사용해야 하는 이유는 뭘까?

(C#에서는 따로 키워드를 넣지않아도 자동으로 자식소멸자 부모소멸자 잘불린다.)

우선 ClassA를 부모 클래스, ClassB를 ClassA를 상속하는 자식클래스라고 할때

생성자와 소멸자는 다음과 같이 호출된다.

ClassB *B = new ClassB (A 생성자 -> B 생성자)

delete B (B 소멸자 -> A 소멸자)

그런데 만약 다형성 이용을 위해 ClassA 포인터에 자식 클래스 ClassB를 할당하면 어떻게 될까?

classA *A = new ClassB (A 생성자 -> B 생성자)

  1. delete A (if ClassA destructor is virtual, B 소멸자 -> A 소멸자)
  2. delete A (if ClassA destructor is not virtual, A 소멸자)

부모 클래스의 소멸자를 virtual로 선언하지 않으면 자식 클래스의 소멸자가 작동하지 않는다. 그 이유는 가상함수로 정의되지 않은 자식 클래스의 오버라이딩된 함수를 선언하면 부모 클래스의 멤버 함수가 호출되기 때문이다. 이와 같은 이유로 자식 클래스의 메모리 해제가 필요하다면 반드시 부모 클래스에 소멸자를 작성해야한다. (부모 클래스의 소멸자를 virtual로 선언하지 않으면 가상함수테이블에서 자식의 소멸자를 찾을수 없기 때문이다.)