virtual 소멸자
- 부모 클래스의 소멸자에
virtual 키워드를 명시하지 않으면 기본적으로 정적 바인딩(static binding)이 적용된다. 즉, Parent* 타입 포인터로 delete를 호출하면, 실제 객체 타입(Child)이 아닌 포인터의 타입(Parent)에 맞춰 부모 소멸자만 호출된다. 반면에 소멸자를 virtual로 선언하면, 동적 바인딩(dynamic binding)을 통해 실제 객체 타입에 맞춰 자식 소멸자가 먼저 호출되고, 그 후 부모 소멸자가 호출되는 올바른 순서가 보장된다.
class Player
{
public:
Player() {
cout << "Player()" << endl;
}
~Player()
{
cout << "~Player()" << endl;
}
};
class Pet
{
};
class Archer : public Player
{
public:
Archer() {
pet = new Pet();
cout << "Archer()" << endl;
}
~Archer() {
delete pet;
cout << "~Archer()" << endl;
}
private:
Pet* pet;
};
int main() {
Archer* archer1 = new Archer();
delete archer;
Player* player = new Archer();
delete player;
while(true) {
Player* player = new Archer();
delete player;
}
}

- 부모 소멸자에
virtual 키워드를 붙이지 않으면, 자식 소멸자가 전혀 호출되지 않아 자식 클래스가 관리하던 자원(동적 메모리, 파일 핸들 등)이 제대로 해제되지 않는 문제가 발생할 수 있습니다.