본문 바로가기
번역/Bjarne Stroustrup's C++ Style and Technique FAQ

Why are destructors not virtual by default?

by 겜게준 2019. 2. 26.

왜 파괴자는 기본적으로 virtual이 아닌가요?


왜냐하면 많은 클래스가 기본 클래스(부모 클래스)로 사용하려고 디자인하지 않기 때문입니다. 가상함수들은 파생 클래스의 객체의 인터페이스 역할을하는 클래스에서만 의미가 있습니다 (전형적으로 힙에 할당되어있고, 포인터나 참조형으로 접근될 때).


그러면 언제 파괴자를 virtual로 선언해야 합니까?


클래스에 적어도 1개의 가상함수가 있을때 선언합니다. 가상함수가 있으면 클래스가 파생 클래스의 인터페이스의 역할을 하는것을 나타내며, 파생 클래스의 오브젝트가 base의 포인터를 통해 파괴될 수 있습니다. 예를 들자면 : 


class Base {

// ...

virtual ~Base();

};


class Derived : public Base {

// ...

~Derived();

};


void f()

{

Base* p = new Derived;

delete p; // virtual destructor used to ensure that ~Derived is called

}


만약 Base의 파괴자가 virtual이 아니었다면, Derived에 소요권이 있는 리소스가 해제되지 않는 등의 나쁜 결과와 같이 Derived의 파괴자가 호출이 되지 않습니다.

댓글