簡體   English   中英

覆蓋非虛擬功能

[英]override on non-virtual functions

它說的是C ++ 11 FDIS

如果使用virt-specifier覆蓋標記了虛函數並且不覆蓋基類的成員函數,則程序格式錯誤。 [示例:

 struct B { virtual void f(int); }; struct D : B { void f(long) override; // error: wrong signature overriding B::f void f(int) override; // OK }; 

如果B::f不會被標記為虛擬怎么辦? 程序格式錯誤嗎? 還是被override然后被忽略`。 我在標准文本中找不到這種情況的任何處理。

更新1/2 (合並)我將請求轉發給C ++編輯器以調查問題。 感謝約翰內斯向我指出這一點。

  • “無效f(long)覆蓋”不會覆蓋函數,特別是。 沒有虛擬的,
  • 因此它不是虛擬的
  • 因此,文本“如果虛擬功能標記有...”不適用
  • 因此,該示例與文本不匹配。

但是通過意識到這一點,我發現無法滿足“ override”上下文關鍵字的意圖:如果函數名稱中的錯字或錯誤的參數類型確實使函數本身不是虛擬的,那么該標准的文本將永遠不適用- -而“替代”則變得無用。

最好的解決方案可能是

  • 將“虛擬”放在示例功能的前面

如果B::f不會被標記為虛擬怎么辦? 程序格式錯誤嗎?

是的。 因為為了覆蓋某些內容,所以某些內容必須是虛擬的。 否則,它不會被覆蓋 ,而是會被隱藏 因此,肯定的答案來自您問題的引文。

如果B:f是非虛擬的,則兩個 D:f函數都將格式錯誤。

是的,將override添加到任何非虛擬函數時,程序格式不正確。

通常,具有不同簽名(重載)的功能與具有不同名稱的功能一樣。 在規格中給出的例子並不意味着暗示函數名影響override 它旨在顯示override旨在防止的常見錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM