다형성을 가진 기본 클래스는 소멸자를 가상 함수로 선언할 것
항목 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; //기본 클래스 포인터를 활용해서 메모리 반환 }
댓글
댓글 쓰기