가상 소멸자
클래스에 가상 함수를 정의할 때 주의할 점은 소멸자도 가상함수로 만들어야 한다는 점입니다.
동적으로 생성한 파생 클래스 객체를 기본 클래스 포인터로 가리키고 있을 때 동적으로 생성한 객체를 해제하려면 기본 클래스 포인터로부터 delete 해야 합니다.
delete pShape;는 pShape가 Shape 포인터이므로 Shape 클래스의 소멸자를 호출합니다.
- delete pShape;는 항상 기본 클래스인 Shape 클래스의 소멸자만 호출됩니다.
- pShape가 실제로는 Rectangle 클래스 객체의 주소를 저장하므로 pShape로 delete할 때 Rectangle의 소멸자가 호출되어야 합니다.
- 이를 위해 Shape 클래스의 소멸자를 가상함수로 선언하면 됩니다.
동적으로 생성한 파생 클래스의 객체를 기본 클래스 포인터로 가리킬 때 기본 클래스 포인터로 delete 하더라도 파생 클래스의 소멸자가 호출되도록 하려면 기본 클래스의 소멸자를 가상 소멸자로 정의해야 합니다.
- 기본 클래스의 소멸자를 가상 함수로 선언하면 파생 클래스의 소멸자도 모두 가상 함수가 됩니다.
- 이 때, 파생 클래스 소멸자에는 virtual 키워드를 생략할 수 있습니다.
Shape 기본 클래스 가상 소멸자 추가 (~Shape();)
Rectangle 파생 클래스 소멸자 추가
- 파생 클래스의 소멸자에는 가상 소멸자를 사용하지 않아도 됩니다.
Eclipse 파생 클래스 소멸자 추가
- 파생 클래스의 소멸자에는 가상 소멸자를 사용하지 않아도 됩니다.
'Programming Language > C, C++' 카테고리의 다른 글
C++ malloc/free와 new/delete의 차이점 (0) | 2014.11.12 |
---|---|
C++ 가상 함수 (virtual) - 가상 함수의 원리 (1) | 2014.11.07 |
C++ 가상 함수 (virtual) - 동적 바인딩 (0) | 2014.11.07 |
C++ 가상 함수 (virtual) - 기본 (0) | 2014.11.07 |
C++ 상속 (0) | 2014.11.07 |