모든 상위 클래스의 소멸자는 가상이어야 하는가?

C++ 의 모든 base class 의 destructor 는 꼭 virtual 이어야 할까요?

당연한 이야기지만 정답은  “아니다.” 입니다.

polymorphic base class 의 경우는 그래야겠지만 단순히 base class 라면 꼭 그럴 필요는 없습니다. 일단 non-virtual destructor 가 문제되는 경우가 하위 클래스의 인스턴스를 상위 클래스로 업캐스팅 해서 사용하다가 삭제하는 경우이므로 이런 경우가 발생하지 않는다면 문제가 없다는 이야기입니다.

예를 들면 boostnoncopyable 등의 클래스를 상속한 하위 클래스에서 noncopyable 로 업캐스팅해서 사용하다가 delete 하는 경우는 상상하기 어렵겠죠? 따라서 이런 클래스들은 소멸자가 가상 함수가 아닙니다.

물론 그럴리가 없다고 생각하는 경우라도 혹시나 다른 프로그래머가 그렇게 할지도 모른다는 염려가 든다면 아래와 같이 작성해주면 됩니다.

class BaseClassNotPolymorphic
{
  protected:
    ~BaseClassNotPolymorphic() {}
};

이렇게 base class 의 destructor 를 protected 로 설정해두면 이 클래스의 포인터로 delete 등을 시도할 때 컴파일 타임 에러가 발생하므로 문제를 미연에 방지할 수 있습니다. :) 그리고 실제로 boost 의 noncopyable 클래스의 경우 생성자와 소멸자가 전부 protected 입니다.

Related posts

  1. 홀짝도 구분 못하는 STL
  2. STL 을 믿지 마세요. – std::string 의 find()
  3. C++ Labyrinth #1
  4. STL 사용과 코드의 복잡성 및 가독성에 대한 소고
  5. Subversion 에서 로그 메시지 수정이 안된다?

Tags: , ,

  • http://rein.upnl.org rein

    단순 base class이거나, C의 struct 처럼 쓰는 애들이면 저럴 필요가 없지.

    내 경우엔, virtual function이 하나라도 있어야만 — 보통 그 경우엔 아예 abstract base 로 만들기도 하고 — virtual dtor를 만들어주지;

  • Pingback: rein's world

  • Calmtot

    잘보고 갑니다~

    • http://j.strane.net J.Strane

      리플 남겨주셔서 감사합니다.
      리플이 달리면 저도 글을 다시 읽게 되어서 복습하는 효과가 있네요.^^;

    • http://j.strane.net J.Strane

      리플 남겨주셔서 감사합니다.
      리플이 달리면 저도 글을 다시 읽게 되어서 복습하는 효과가 있네요.^^;