다형성을 가진 기본 클래스는 소멸자를 가상 함수로 선언할 것

항목 7 : 다형성을 가진 기본 클래스는 소멸자를 가상 함수로 선언할


 기반 클래스의 소멸자가 비가상 함수라면,

기반 클래스 포인터에서 delete 명령어로 소멸자를 호출할때 기반클래스의 소멸자는 호출되지만 파생클래스 소멸자는 호출되지 않는다!!!

(클래스의 다형성을 고려한다면 기반클래스에서 소멸자에 virtual 키워드는 필수)



 따라서 std::string 같은 클래스는 따로 가상 소멸자를 가지고 있지 않으니 string 을 상속해서 새로운 파생 클래스를 만드는 것은 위험한 행위.



 -그래도 virtual 키워드를 남용하지는 말자. 클래스가 다형성을 가질 필요가 없다면 가상 소멸자는 필요가 없다.
(가상 함수 테이블 포인터가 생성되면 어찌됐건 클래스 크기는 증가하므로)

class TimeKeeper {
public:
 TimeKeeper();
 //~TimeKeeper(); //기본 클래스 포인터로 객체를 삭제할 때, 소멸자가 가상함수가 아니라면 
      //클래스의 기본 클래스 부분만 삭제하고, 파생클래스 부분은 삭제되지 않는다.

 virtual ~TimeKeeper(); //소멸자에 virtual 키워드를 붙여서 해결

 virtual TimeKeeper* getTimeKeeper();
};

class AtomicClock : public TimeKeeper {};
class WaterClock : public TimeKeeper {};

void DoSomething() {
 AtomicClock ac;

 TimeKeeper* ptk = ac.getTimeKeeper();
 delete ptk; //기본 클래스 포인터를 활용해서 메모리 반환
}

댓글

이 블로그의 인기 게시물

Unity - Dialogue 시스템을 구현할 때 유용한 무료 에셋

Unity - 메타 파일

Unity - 라이브러리 폴더