2015-11-20 40 views
2

假設我們有下面的代碼:我應該在派生類中顯式聲明析構函數爲覆蓋嗎?

class ISampleInterface 
{ 
public: 
    virtual ~ISampleInterface() {} ; 
    virtual void Method1() = 0; 
    virtual void Method2() = 0; 
}; 

class SampleClass : public ISampleInterface 
{ 
public: 
    SampleClass() { }; 
    ~SampleClass() override { }; 
    void Method1() { }; 
    void Method2() { }; 
}; 

int main() 
{ 
    ISampleInterface *pObject = (ISampleInterface*)new SampleClass(); 
    delete pObject; 
    return 0; 
} 

是更好明確聲明〜SampleClass()爲覆蓋或不關心?

P.S.請注意重寫,而不關心析構函數本身的實現。它可以被定義,我只是在這裏舉例來明確我的問題。

回答

1

我不會這麼做。我也沒有看到明確聲明一個微不足道的析構函數。讓編譯器完成它的工作。你可能需要在你的類中引入一個析構函數來(i)使這個類具有多態性 - 儘管任何函數都可以做到這一點 - 並且(ii)協助內存管理,但這不是嚴格意義上的。

或者,如果你必須做這樣的事情,考慮使用= default表示法,而不是明確提供空體。

+0

感謝您的意見,但它實際上不是答案。 – metal4people

0

恕我直言,任何答案都會有偏差(即基於意見)。通常,使用的override符之中的許多優點具有消除的優點:

  • 無意首要:通過聲明偶然具有相同的名稱和簽名作爲成員函數無意中重寫虛擬功能的基類的虛擬成員函數。

  • 簽名不匹配:在派生類中定義一個函數,用於覆蓋基類中的虛函數,但這兩個函數具有不同的簽名。

There are even people that back up the opinion that the use of override specifier should be mandatory in future version of C++.

現在,在析構函數的特殊情況下,在安裝override符在我看來有點冗長。

而我會盡力清除我的立場。析構函數是一個特殊的成員函數。考慮到類層次結構,派生類的析構函數默認覆蓋基類的析構函數(因爲已知的原因應聲明爲virtual)。此外,您沒有前面提到的優點(即,在析構函數的情況下,不會有無意的覆蓋或簽名不匹配)。

因此,我不會指定一個析構函數override

0

看起來像我發現至少有一個原因,爲什麼它是更好的使析構重載。 override用於析構函數防止在接口基類的析構函數未聲明爲virtual時出錯。

相關問題