2012-11-04 79 views
44

在Visual C++ 2012中有沒有強制使用C++ 11 override關鍵字的方法?如何執行「覆蓋」關鍵字?

(即,如果我忘了說override,那麼我希望得到一個警告/錯誤。)

+3

@HansPassant:Visual C++? – Mehrdad

+10

這個問題爲什麼關閉?有關C++編譯器警告的問題是否有問題? (如果答案是「否」,那麼這是一個完全有效的答案..) – Mehrdad

+12

@Mehrdad:___我不認爲這個問題有什麼問題。如果它真的被關閉,應該重新打開。 – sbi

回答

21

C++ 11幾乎有你想要的東西。

本來override關鍵字是一個更大的提案(N2928)的一部分,其也包括執行其使用的能力:

class A 
{ 
    virtual void f(); 
}; 

class B [[base_check]] : public A 
{ 
    void f(); // error! 
}; 

class C [[base_check]] : public A 
{ 
    void f [[override]](); // OK 
}; 

base_check屬性將使它的錯誤覆蓋一個虛擬函數,而無需使用override關鍵字。

還有一個hiding屬性,它表示函數隱藏了基類中的函數。如果使用base_check,並且函數在不使用hiding的情況下隱藏基類中的一個,則這是錯誤。

但是大多數提案被刪除,只有finaloverride功能被保留,作爲「具有特殊含義的標識符」而不是屬性。

+1

這個建議是否被再次考慮用於未來版本的標準? – Xeo

+3

@Xeo:如果沒有人爲此遊說,那麼它就不會被看到。我個人只是把它放在了笨蛋,例如,基於鏗鏘聲,並強制檢查。 –

+0

不*很*回答這個問題(因爲雖然它不在C++ 11中,但Visual C++可能仍然有某種警告我不知道),但仍然是很好的信息,謝謝。 +1 – Mehrdad

4

有很少的方法可以在VC++中做到這一點,以及與GCC同樣的方式。

VC++

下面是VC相關的警告編號++:

C4263 (level 4) 'function': member function does not override any base class virtual member function 
C4266 (level 4) 'function': no override available for virtual member function from base 'type'; function is hidden 

爲了使這兩個警告,您可以使用下列選項之一:

  1. 設置警告級別在項目設置中爲4,然後禁用不需要的警告。這是我最喜歡的方式。要禁用不需要的級別4警告,請轉到項目設置> C/C++>高級,然後在禁用特定警告框中輸入警告號碼。
  2. 使用代碼啓用上述兩個警告。

    #pragma warning(default:4263) 
    #pragma warning(default:4266) 
    
  3. 啓用上述項目設置> C/C++>命令行兩次警告,然後輸入/ w34263/w34266。這裏/ wNxxxx選項表示在級別N中啓用xxxx警告(N = 3是默認級別)。你也可以做/ wdNxxxx其禁用水平N的XXXX警告

GCC

GCC 5.1及更高版本增加了新的預警提示,覆蓋,你可以傳遞作爲命令行選項-Wsuggest-override

鏘3.5+有-Winconsistent-missing-override然而,這隻能檢測情況下,如果基類使用覆蓋,但家長不。你也可以看看叮噹的工具。

+4

那些VC++警告用於_including_ override,它不適用。問題是要求在_missing_覆蓋中發出警告。 – mskfisher