2013-06-26 151 views
6

在此代碼:虛擬函數可以被非虛函數覆蓋嗎?

class Base { 
public: 
    virtual void method() = 0; 
}; 

class Derived1 : public Base{ 
public: 
    virtual void method() override { } 
}; 

class Derived2 : public Base{ 
public: 
    void method() override { } 
}; 

Derived1Derived2之間有什麼區別?

+3

'Derived2 :: method2'是虛擬的。如果語法允許,則使用 –

+0

。 (未選中),那麼'derived2-> method()'也將是虛擬的(雖然隱含) – Alex

+0

@ R.MartinhoFernandes:那麼virtual關鍵字是隱含的? – Eric

回答

16

從部分10.3虛擬函數的C 11標準(草案n3337)點的++ 2:

如果虛擬成員函數VF在類Base和在派生的類聲明,派生直接或間接地從Base獲得 ,聲明與Base :: vf具有相同名稱,參數類型列表(8.3.5),cv限定和重新限定符 (或不存在)的成員函數vf,然後Derived :: vf也是虛擬的(不管它是否如此聲明的 )並且它覆蓋Base :: vf。

因此Derived2::method也是virtual,即使它沒有明確聲明爲這樣。

+0

是否需要聲明沒有virtual關鍵字的成員?發生這種情況時,GCC可以發出警告嗎? – Eric

+0

@Eric:有人認爲標記派生函數虛擬作爲文檔,其他人認爲這是不必要的代碼膨脹。在實踐中,這兩種方式並不重要。 –

+4

使用C++ 11,可以使用override關鍵字來指示派生類中的函數是虛擬的。 –

4

它們是相同的。

virtual在實際覆蓋函數時是可選的。只有在基類中標記函數時纔是必需的。