2009-05-05 3 views
14

기본 클래스 (기준)에서 상속 된 많은 상속 클래스 (기준) 세트가 있습니다. 나는 전혀 여기 소멸자를 가지고 있지 않기 때문에C++의 가상 기본 소멸자

class fastFilter : public criterion 
{ 
public: 
    void reorderTree() {}; 
    unsigned int directoryCheck(const std::wstring& /*directory*/) const { return DIRECTORY_DONTCARE; }; 
    unsigned __int32 getPriorityClass() const { return PRIORITY_FAST_FILTER; }; 
}; 

class isArchive : public fastFilter 
{ 
public: 
    BOOL include(fileData &file) const 
    { 
     return file.getArchive(); 
    } 
    std::wstring debugTree() const 
    { 
     return std::wstring(L"+ ISARCHIVE\n"); 
    }; 
}; 

, 아직 이것은 기본 클래스 있어야하는데 : 다음이 하나에서 파생 된 클래스의

class criterion 
{ 
public: 
    virtual unsigned __int32 getPriorityClass() const = 0; 
    virtual BOOL include(fileData &file) const = 0; 
    virtual void reorderTree() = 0; 
    virtual unsigned int directoryCheck(const std::wstring& directory) const = 0; 
    virtual std::wstring debugTree() const = 0; 
}; 

몇 가지 예는 criterion의 코드입니다 , 빈 가상 소멸자를 삽입해야합니까, 즉 like :?

virtual void ~criterion() = 0; 

가상 소멸자 선언이 필요한 경우 모든 중간 클래스도 필요합니까? 나는. 위의 fastFilter는 가상 소멸자도 필요합니까?

+0

위의 것은 비어있는 소멸자가 아닙니다. 그것은 순수 가상 함수 인 소멸자입니다. 이것은 비어있는 것과는 아무런 관련이 없습니다. 사실 소멸자는 순수 가상의 경우에도 항상 정의를 가져야한다는 점에서 특별합니다. –

답변

37

예 - 기본 클래스는 비어있는 경우에도 가상 소멸자가 필요합니다. 그렇게하지 않으면 무언가 delete이 기본 포인터/참조를 통해 파생 된 객체 일 때 파생 된 객체의 구성원 객체는 스스로를 올바르게 파괴 할 기회를 갖지 않습니다.

파생 클래스는 기본 소멸자 동작 이외의 것이 필요하지 않으면 자체 소멸자를 선언하거나 정의 할 필요가 없습니다.

23

권장 기본 클래스 포인터 문제 오프 삭제를 방지하기 위해

virtual ~criterion() {} 

를 삽입하는 것입니다. 그렇지 않으면 파생 클래스의 소멸자가 호출되지 않으므로 메모리가 누출됩니다.

criterion *c = new fastFilter(); 
delete c; // leaks 
+1

순수한 가상 소멸자보다 비어있는 소멸자를 사용해야하는 이유가 있습니까? –

+0

Nevermind ... 다른 사람이 대답했습니다 :) –

+1

'virtual ~ criterion() noexcept {}'가 더 예쁘지 않습니까? – user1095108

12

당신은 그것을 빈 구현을 제공, 소멸자 추상적를 할 필요가 없습니다 : 여전히 각

virtual ~criterion() { } 

당신이 모든 자식 클래스에서 구현하도록 강요하지 않는이 방법을하지만, 그들에게는 상속 된 가상 소멸자가있을 것입니다.

7

다른 사람이 이미 대답 한 것과 하나의 작은 변화 대신

virtual void ~criterion() = 0; 

필요한 버전의

은 다음과 같습니다

virtual ~criterion() {} //Note: Removed void as destructors not allowed 
          // a return type 

이 한 번 봐 가지고 가상 소멸자에 대해 자세히 알려면 FAQ에서 연결 When should my destructor be virtual?