2014-02-21 2 views
1

기본 클래스가 int를 포함하고있는 파일 설명자에 대한 클래스 계층 구조를 가지고 놀았습니다. 파괴 중에 하위 클래스에 close이 호출되고 자식 클래스는 가상 메서드 나 데이터 멤버를 추가하지 않습니다. named_file_filedes은 경로를 가져 와서 ctor에서 open으로 기본을 초기화하거나 가상 멤버가 아닌 함수로 초기화합니다 (예 : kqueue_filedes에서 kevent 만 호출 할 수 있음). 이걸 감안할 때, 기본 클래스는 가상 소멸자가 필요합니까? 하위 클래스의 크기는 모두 동일하며 사용자 정의 파괴 논리를 갖고 있지 않습니다. c++11이라는 태그가 내가 타겟팅하는 표준 버전입니다.자손 클래스에 비 정적 멤버 나 소멸자가없는 경우 가상 소멸자가 필요합니까?

답변

4

delete 파생 클래스가 기본 클래스에 대한 포인터를 통해 파생 된 경우 파생 클래스의 모양과 상관없이 동작이 가상 소멸자없이 정의되지 않습니다.

C++ 11 표준 §5.3.5/3 : 삭제 대상물의 정적 유형이 동적 유형과 다른 경우

정적 타입의 기본 클래스이어야한다 삭제할 객체의 동적 유형과 정적 유형은 가상 소멸자를 가져야하며, 동작은 정의되지 않습니다.

그러나 클래스가 생성자 만 다른 경우 파생에 대한 대안을 사용하는 것이 좋습니다. 예 : create_named_file()과 같은 간단한 무료 함수.

5

파생 클래스 개체를 delete 기본 클래스 포인터로 파괴하려는 경우 virtual 소멸자가 필요합니다. 예를 들면 : 당신이 다형성 할 객체가 필요한 경우

class Foo {}; 
class Bar : public Foo {} 

int main() 
{ 
    Foo* f = new Bar; 
    delete f; // << UNDEFINED BEHAVIOR without virtual destructor in base classe 
} 

또한 기본 적어도 1 virtual 방법이 필요합니다 - 예를 들어, 당신은 유도하기 위해 기지에서 이동 dynamic_cast를 사용하려는 경우. 이 경우에는 일반적으로 가상 소멸자가 제공됩니다. 가상 소멸자 만 있으면 클래스가 다형성을 유지하는 데 충분합니다.