2016-03-16 54 views
1

是否應該明確標記爲虛擬全部覆蓋任何級別的後代類?是否應該聲明在所有級別的繼承或僅在祖先級別虛擬的函數?

class Base { 
// ... 
protected: 
    virtual void to_be_derived() const; // First level to introduce this virtual function 
}; 

class LevelOne : public Base { 
// ... 
protected: 
// virtual?? 
void to_be_derived() const; 
}; 

class LevelTwo : public levelOne { 
// ... 
protected: 
// virtual?? 
void to_be_derived() const; 
}; 

我沒有看到Prefixing virtual keyword to overridden methods它回答我的問題。特別是,其中的一個答案已更新,以反映與C++ 11相關的當前使用情況,特別是我不知道的override關鍵字!

編輯:我寧願接受來自鏈接問題的後C++ 11代碼的另一個答案。

+1

在dervied類中默認是虛擬的,所以添加虛擬後綴與否,函數將是虛擬的 – jonezq

+0

請注意,即使使用'override' /'final'的(正確)答案已經出現在上面的問題中。 –

+0

@jonezq我知道這個函數仍然是虛擬的,但我將它看作是向*類用戶顯式傳達它是虛擬的。 –

回答

9

現在,最好將它們標記爲override。它告訴讀者該函數是虛擬的,並且也是一個故障安全機制(如果你的簽名是錯誤的)。

我只使用virtual如果這符合已經存在的代碼。

class LevelOne : public Base { 
protected: 
    void to_be_derived() const override; 
    //       | 
    // clearly virtual, certain it's the same signature as the base class 
}; 
+0

我不知道有關「覆蓋」關鍵字的方式。感謝您的關注! –

+0

需要說明的是,第一次出現'to_be_derived'仍然需要'virtual'而沒有'override'關鍵字? –

+0

@greendiod是的。 –

-2

基類Virtual將強制繼承類,即LevelOne覆蓋它。

除非您需要LevelTwo來覆蓋LevelOne的實現,否則不需要將其標記爲虛擬。

一般來說,除非派生類重寫它,無需使用虛擬

+0

「除非需要LevelTwo來覆蓋LevelOne的實現,否則不需要將其標記爲虛擬。」 ??? – jonezq

+1

基類virtual不會強制繼承類重載它。另外,如果函數在基類中是虛擬的,那麼你不需要在中間派生類中聲明它是虛擬的,以便覆蓋大部分派生類。 – user2079303

-1

這是更好的將其標記爲虛擬和覆蓋。虛擬會阻止您爲交付的對象調用錯誤的函數。重寫將防止您在簽名中出錯,並使代碼更具可讀性。如Scott Meyers在有效的C++書中寫的,你不應該在delevired類中重新定義非虛函數。

+0

虛擬*如何防止您調用錯誤的函數*? – user2079303

+0

我的意思是說,如果有人在LevelOne和LevelTwo類中聲明to_be_derived()非虛函數,並寫出類似LevelOne * p1 = new LewelTwo的東西; P1-> to_be_derived();錯誤的功能將被調用。 –

+1

您不能在LevelOne中聲明be_derived是非虛擬的,因爲它在Base中是虛擬的。 – user2079303

相關問題