2010-07-02 122 views
21

這可能以前曾被問過,但我無法找到類似的問題。我是否還需要在子類方法上指定虛擬?

考慮下面的類層次結構:

class BritneySpears 
{ 
    public: 

    virtual ~BritneySpears(); 
}; 

class Daughter1 : public BritneySpears 
{ 
    public: 

    virtual ~Daughter1(); // Virtual specifier 
}; 

class Daughter2 : public BritneySpears 
{ 
    public: 

    ~Daughter2(); // No virtual specifier 
}; 

Daughter1Daughter2類之間的區別嗎?

對子類析構函數/方法指定/未指定virtual有什麼後果?

謝謝。

+2

請注意讀者:也請看看C++ 11中的['override'](http://stackoverflow.com/questions/13880205/override-in-c11)關鍵字,它與那個話題。 – ereOn 2014-06-12 06:57:40

回答

28

不,你在技術上不需要指定virtual。如果基本方法是虛擬的,則C++將自動生成匹配重寫方法virtual

但是,你應該標記它們virtual。該方法畢竟是virtual,它使您的代碼更清晰,更容易被其他開發人員關注。

+0

這裏有很多很好的答案。我選擇了最受歡迎的:)謝謝大家。 – ereOn 2010-07-02 16:01:25

6

無論您是否在子類中指定虛擬,派生方法覆蓋都會自動獲取虛擬。

主要後果是,如果沒有在孩子中指定虛擬,那麼很難從子類定義中看到該方法實際上是虛擬的。出於這個原因,我總是在父類和子類中指定虛擬。

8

You do not need it,但標記它可能會使您的代碼更清晰。

注意:如果你的基類有虛析構函數 ,那麼你的析構函數是 自動虛擬的。您可能需要 顯式析構函數爲其他 的原因,但沒有必要 重新聲明析構函數只是爲了使 確定它是虛擬的。無論是 您聲明虛擬 關鍵字,聲明它沒有 虛擬關鍵字,或根本不聲明它 它仍然是虛擬的。

相關問題