코딩하는 두식이

Effective C++ 항목 7 : 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자. 본문

공부/C++

Effective C++ 항목 7 : 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자.

털빙이 2021. 5. 10. 18:02

기본 클래스와 상속받은 클래스들을 다음과 같이 정의했을때

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. 가상 함수가 하나라도 있는 클래스는 (다형성을 띄고있는 클래스는) 무조건 가상 소멸자로 정의해야한다.