3 回答

TA貢獻1786條經驗 獲得超11個贊
確實是這個主意。關鍵是您要清楚自己的意思,以便可以診斷出其他無提示的錯誤:
struct Base
{
virtual int foo() const;
};
struct Derived : Base
{
virtual int foo() // whoops!
{
// ...
}
};
上面的代碼可以編譯,但不是您想要的(請注意缺少的內容const)。如果改為,virtual int foo() override則將出現編譯器錯誤,即您的函數實際上并未覆蓋任何內容。

TA貢獻2003條經驗 獲得超2個贊
維基百科報價:
覆蓋特殊標識符意味著編譯器將檢查基類,以查看是否存在具有此確切簽名的虛函數。如果沒有,編譯器將出錯。
http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_overrides_and_final
編輯(嘗試改善答案):
將方法聲明為“覆蓋”意味著該方法旨在在基類上重寫(虛擬)方法。覆蓋方法必須具有與其打算重寫的方法相同的簽名(至少對于輸入參數而言)。
為什么這是必要的?好吧,可以防止以下兩種常見的錯誤情況:
一個人在新方法中輸入了錯誤的類型。編譯器不知道要編寫先前的方法,只是將其作為新方法添加到類中。問題在于舊方法仍然存在,新方法只是作為重載而添加。在這種情況下,對舊方法的所有調用將像以前一樣起作用,而行為沒有任何變化(這正是重寫的目的)。
人們忘記將超類中的方法聲明為“虛擬”,但仍嘗試在子類中重寫它。雖然這顯然會被接受,但是行為將不完全符合預期:該方法不是虛擬的,因此通過指向超類的指針進行的訪問將結束調用舊的(超類')方法,而不是新的(子類')方法。
添加“ override”顯然消除了歧義:通過這一點,一個是告訴編譯器期望的三件事:
在超類中有一個同名的方法
該超類中的此方法被聲明為“虛擬”(意味著,將被重寫)
超類中的方法具有與子類中的方法(重寫方法)相同的(input *)簽名
如果其中任何一個為假,則發出錯誤信號。
*注意:輸出參數有時是不同的但相關的類型。如有興趣,請閱讀有關協變和逆變換的信息。

TA貢獻1811條經驗 獲得超6個贊
C ++ 17標準草案
在仔細override研究了C ++ 17 N4659標準草案中的所有內容之后,我可以找到的對該override標識符的唯一參考是:
5如果虛擬函數被virt-specifier覆蓋標記,并且沒有覆蓋基類的成員函數,則程序格式錯誤。[示例:
struct B {
virtual void f(int);
};
struct D : B {
virtual void f(long) override; // error: wrong signature overriding B::f
virtual void f(int) override; // OK
}
—結束示例]
所以我認為可能炸毀錯誤的程序實際上是唯一的效果。
- 3 回答
- 0 關注
- 529 瀏覽
添加回答
舉報