Item7_다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자
챕터 핵심 내용
- 다형성을 가진 기본 클래스에는 반드시 가상 소멸자를 선언해야 한다.
- 기본 클래스로 설계되지 않았거나 다형성을 갖도록 설계되지 않은 클래스에는 가상 소멸자를 선언하지 말아야 한다.
- 다형성을 가진 기본 클래스에는 반드시 가상 소멸자를 선언해야 한다
- 기본 클래스 포인터를 통해 파생 클래스 객체가 삭제될 때 그 기본 클래스에 비가상 소멸자가 들어있으면 미정의 동작을 일으킨다.
- 가상 소멸자로 선언하지 않으면 파생 클래스 부분이 소멸되지 않는다.
- 이를 이용해 추상 클래스를 만들 때, 마땅히 넣을 가상 함수가 없다면 순수 가상 소멸자를 이용할 수 있다. 단, 정의까지 해야 한다.
- 기본 클래스로 설계되지 않았거나 다형성을 갖도록 설계되지 않은 클래스에는 가상 소멸자를 선언하지 말아야 한다
- 가상 함수를 C++에서 구현하려면 클래스에 별도의 자료구조가 들어가게 된다.
- 이 자료구조란 프로그램 실행 중에 주어진 객체에 대해 어떤 가상 함수를 호출해야 하는지를 결정하는 데 쓰인다. 실제로는 포인터의 형태를 취하게 된다.
- vptr(virtual table pointer) : vtbl을 가리키는 포인터
- vtbl(virtual table) : 가상 함수의 주소가 담긴 테이블
- 클래스에 가상 함수가 추가되면 그만큼 객체의 크기가 커진다.