2014-06-13 11 views
14

當我重寫虛函數:當我重寫C++函數時,我應該再次指定'虛擬'嗎?

class Geoff 
{ 
public: 
    virtual int getArea() { return 0; } 
} 

我應該指定「虛擬」當我再次重寫呢?它有什麼區別?我知道這兩種方式似乎都很好,只是想知道是否還有更多。

class George : public Geoff 
{ 
public: 
    virtual int getArea() { return x*y; } 
} 
+0

這不是一個騙局,但它肯定是相關的。 –

+0

@一二三:這是一個糟糕的重複候選人,因爲它實際上會詢問你是否可以用某種方式「替換」一個函數***而不使用虛擬關鍵字***(好的答案解釋了隱藏和虛擬調度之間的區別) 。 –

+1

@TonyD - 這是一場你看到的比賽,成爲第一個通過將問題編輯成非問題或者完全關閉問題來解決問題的人。 ;-P –

回答

26

如果使用C++ 11,你應該使用override代替,這是您要覆蓋一個虛函數,並檢查用於重寫基地存在匹配的虛擬函數這兩個文件。

int getArea() override { return x*y; } 

在C++ 03這是一個風格上的選擇 - 把virtual如果您覺得它增加了文檔的價值。

+2

您還可以使用'final'來防止進一步覆蓋,並且讓編譯器更容易對該成員函數進行虛擬化調用。 –

+1

我想如果你知道GEORGE將會被擴展,那麼就使用它。爲了理解目的。 –

+1

@ Al-mo對不起,但那是個不好的建議。 「覆蓋」在展示該方法是虛擬方面不夠明確。 –

7

不,請使用覆蓋。 (http://en.cppreference.com/w/cpp/language/override

如果該方法在父代中不是虛擬的,它具有失敗的優點。

編輯

正如馬克指出,這也如果簽名不匹配,而虛擬就會靜悄悄地「成功」的失敗。恐嚇報價是因爲一個不匹配的簽名會隱藏基地中的陰影方法,並創建一個不相關的新虛擬方法。

+1

它還檢查重寫方法是否具有與被覆蓋的方法相兼容的簽名(它實際上覆蓋了方法,是)。 –

+0

@MarkGarcia這是真的,也是一個很好的觀點,因爲在嘗試覆蓋時不會意外超載。 –

+0

謝謝,覆蓋仍然在VS2010中爲我生成一個警告,所以我必須和我們的架構師一起研究那個。 –

相關問題