C++에서 클래스 상속 연습 중인데요, 튜토리얼마다 "부모 클래스 소멸자에는 virtual 붙여라"라고 하는데 왜 그래야 하는지 설명이 없어서 그냥 습관처럼 붙이고만 있었어요. 이유를 알고 싶습니다.
지금 이런 구조로 짜봤어요.
struct Base {
~Base() { puts("Base 소멸"); }
};
struct Derived : Base {
~Derived() { puts("Derived 소멸"); }
};
Base *p = new Derived();
delete p;
이렇게 하니까 "Base 소멸"만 찍히고 "Derived 소멸"은 안 찍히더라고요. Derived 쪽 소멸자가 아예 안 불리는 것 같아요. 근데 ~Base() 앞에 virtual만 붙이니까 둘 다 정상적으로 찍혔어요.
제가 이해한 건 부모 포인터로 자식 객체를 delete 하면 자식 소멸자를 건너뛴다는 건데, 이게 왜 그런 건지 원리가 궁금해요. 그리고 만약 Derived가 안에서 뭔가 new로 메모리를 잡고 있었으면 그게 다 안 풀려서 새는 거 맞나요? 실무에서 이거 안 붙였다가 크게 문제 된 적 있으면 그런 얘기도 듣고 싶습니다.