-
Effective C++...6일지 2022. 6. 4. 08:41
다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자
기본 클래스의 소멸자가 가상 소멸자가 아닐 때의 문제
파생 클래스 객체가 삭제될 때 기본 클래스에 비가상 소멸자가 들어 있으면 파생 클래스의 소멸자가 호출되지 않는다.
즉, 기본 클래스가 가상 소멸자가 아닌 경우 파생 클래스가 정상적으로 제거되지 않는다.
※ 가상 함수를 하나라도 가진다면 소멸자를 가상 소멸자로 선언해야 한다.
모든 클래스에 가상 소멸자를 넣는 것은 다른 문제
가상 함수가 하나라도 있다면 vptr이라는 가상 함수 포인터가 생성되어 클래스의 크기가 커지게 된다.
// 비가상 소멸자를 가진 Point 클래스, 크기는 64bit
class Point {
public:
Point(int xCoord, int yCoord);
~Point();
private:
int x, int y;
}
// 가상 소멸자를 가진 Point 클래스, 크기는 32bit 아키텍처에서 96bit, 64bit 아키텍처에서 128bit
class Point {
public:
Point(int xCoord, int yCoord);
virtual ~Point();
private:
int x, int y;
}
※ 상속받는 클래스에 가상 소멸자가 적용되었는지 확인하자.