코딩하는 두식이
Effective C++ 항목 7 : 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자. 본문
기본 클래스와 상속받은 클래스들을 다음과 같이 정의했을때
class TimeKeeper{
public:
TimeKeeper();
~TimeKeeper();
TimeKeeper* getTimeKeepr(); // 팩토리 함수
};
class AtomicClock :public TimeKeeper{};
class WaterClock :public TimeKeeper{};
class WristWatch :public TimeKeeper{};
기본 클래스의 포인터로 파생 클래스 (AtomicClock )의 객체를 가리키고 있으면 해제 시 기본 클래스의 소멸자만 불린다. (기본 클래스의 소멸자가 비가상 소멸자 이기 때문에..)
TimeKeeper *ptk = getTimeKeeper();
...
delete ptk;
기본 클래스의 소멸자에 virtual를 붙여준다.
virtual ~TimeKeeper();
주의해야할점
1. 비가상 소멸자로 선언된 클래스는 기본 클래스로서의 역할을 포기한것이다. (상속받아 사용하면 안된다..)
ex) 표준 String의 경우 비가상 소멸자로 정의되어 있기 때문에 해당 클래스를 상속받아 새로운 클래스를 만들면 안된다.
2. 가상 함수가 하나라도 있는 클래스는 (다형성을 띄고있는 클래스는) 무조건 가상 소멸자로 정의해야한다.
'공부 > C++' 카테고리의 다른 글
Effective C++ 항목 4 : 객체를 사용하기 전에 반드시 그 객체를 초기화하자 (0) | 2022.05.07 |
---|---|
Effective C++ 항목 9 : 객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하지 말자 (0) | 2021.05.10 |
Effective C++ 항목 3 : 낌새만 보이면 const를 들이대 보자! (0) | 2021.05.10 |
Effective C++ 항목 2 : #define을 쓰려거든 const, enum, inline을 떠올리자. (0) | 2021.05.10 |
Effective C++ 항목 1 : C++ 를 언어들의 연합체로 바라보는 안목은 필수 (0) | 2021.05.10 |