亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

“ override”關鍵字是否只是對覆蓋的虛擬方法的檢查?

“ override”關鍵字是否只是對覆蓋的虛擬方法的檢查?

C++
暮色呼如 2019-12-09 14:36:17
據我了解,overrideC ++ 11 中關鍵字的引入無非是一項檢查,以確保所實現override的virtual函數是基類中函數的作用。是嗎
查看完整描述

3 回答

?
Qyouu

TA貢獻1786條經驗 獲得超11個贊

確實是這個主意。關鍵是您要清楚自己的意思,以便可以診斷出其他無提示的錯誤:


struct Base

{

    virtual int foo() const;

};


struct Derived : Base

{

    virtual int foo()   // whoops!

    {

       // ...

    }

};

上面的代碼可以編譯,但不是您想要的(請注意缺少的內容const)。如果改為,virtual int foo() override則將出現編譯器錯誤,即您的函數實際上并未覆蓋任何內容。


查看完整回答
反對 回復 2019-12-09
?
湖上湖

TA貢獻2003條經驗 獲得超2個贊

維基百科報價:


覆蓋特殊標識符意味著編譯器將檢查基類,以查看是否存在具有此確切簽名的虛函數。如果沒有,編譯器將出錯。


http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_overrides_and_final


編輯(嘗試改善答案):


將方法聲明為“覆蓋”意味著該方法旨在在基類上重寫(虛擬)方法。覆蓋方法必須具有與其打算重寫的方法相同的簽名(至少對于輸入參數而言)。


為什么這是必要的?好吧,可以防止以下兩種常見的錯誤情況:


一個人在新方法中輸入了錯誤的類型。編譯器不知道要編寫先前的方法,只是將其作為新方法添加到類中。問題在于舊方法仍然存在,新方法只是作為重載而添加。在這種情況下,對舊方法的所有調用將像以前一樣起作用,而行為沒有任何變化(這正是重寫的目的)。


人們忘記將超類中的方法聲明為“虛擬”,但仍嘗試在子類中重寫它。雖然這顯然會被接受,但是行為將不完全符合預期:該方法不是虛擬的,因此通過指向超類的指針進行的訪問將結束調用舊的(超類')方法,而不是新的(子類')方法。


添加“ override”顯然消除了歧義:通過這一點,一個是告訴編譯器期望的三件事:


在超類中有一個同名的方法

該超類中的此方法被聲明為“虛擬”(意味著,將被重寫)

超類中的方法具有與子類中的方法(重寫方法)相同的(input *)簽名

如果其中任何一個為假,則發出錯誤信號。


*注意:輸出參數有時是不同的但相關的類型。如有興趣,請閱讀有關協變和逆變換的信息。


查看完整回答
反對 回復 2019-12-09
?
楊魅力

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

}

—結束示例]


所以我認為可能炸毀錯誤的程序實際上是唯一的效果。


查看完整回答
反對 回復 2019-12-09
  • 3 回答
  • 0 關注
  • 529 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號