古詩詞大全網 - 個性簽名 - 為什麽需要覆蓋關鍵字解決方案?

為什麽需要覆蓋關鍵字解決方案?

C++沒有這個關鍵字。聲明虛函數時,只需要在函數聲明前加上關鍵字virtual,但在虛函數重載時,virtual是可選的。即使在子類中寫了virtual,也不清楚這個函數是第壹次聲明還是重載了基類中的虛函數。更嚴重的是,不看基類的聲明,不使用註釋,是沒有辦法知道壹個函數是不是虛函數的(我的意思是程序員看源代碼的時候不知道,運行時方法不在此討論範圍)。有壹次我整理了幾個月前寫的C++代碼,看到其中壹個類成員函數只是返回了壹個成員變量的值。我認為這樣的成員函數應該聲明為const,這也可以適用於const實例的情況。但這樣壹來,程序的運行結果是不正確的。仔細跟蹤後發現,這個函數原來在基類中聲明為虛函數,子類中的這個版本其實是壹個重載版本,但是我加了const後,它的簽名和基類中的不壹樣了,所以編譯器不再認為它重載了基類中的虛函數,而是壹個全新的函數。編譯器對此無法給出任何有用的信息,只能手動壹點壹點檢查。但是如果像C#壹樣需要C#關鍵字,那麽子類中的重載版本必須是override,這樣壹看就知道是重載方法,我們不會隨意更改它的簽名。

超馳要求是:

1對於非重載方法,不能添加override關鍵字,否則會發生編譯錯誤。

2對於重載方法,必須使用override關鍵字;如果想隱藏基類中的方法,需要使用new關鍵字。

3配合IDE,只要在Visual Studio.Net中輸入override和space,就可以自動列出基類中所有重載的方法。

在這方面,我覺得借助C++的typedef、template或者macro函數,也許可以模擬override keyword的功能。

我的壹個不成形的想法是:

1將virtual定義為VIRTUAL,然後將編寫的虛函數名稱定義為非法,直接在子類中重載會導致編譯時錯誤。

2定義OVERRIDE,首先檢查重載函數名是否有非法定義,如果沒有,則定義非法結果,導致編譯時錯誤,使OVERRIDE關鍵字不能應用於非重載函數。

如果有非法定義,讓它先取消被重載的函數名的非法定義,然後正常重載,再非法重定義壹次,這樣虛函數就可以正確重載了。

但是還是有壹些問題,就是在編寫重載函數的實現,調用這樣聲明的函數時會出現壹些問題,因為對應的函數名已經被定義為非法,不能直接使用。可能需要更復雜的宏定義來解決它。

想法是這樣,但是具體實施起來問題很多。我還沒有實驗成功,所以我把我的想法保存在這裏,以備將來參考。