NEW IN C++ 11

source::http://www.devbean.net/2012/05/cpp11-override-final/

參考文章:https://blogs.oracle.com/pcarlini/entry/c_11_tidbits_explicit_overrides

2012 年 3 月 22 日,GCC 4.7.0 正式發佈。從這個版本開始,GCC 增加了許多新的 C++ 11 的特性。今天我們要介紹的是其中的一個特性:顯式的使用 finaloverride關鍵字。先來看下面的例子:

上面的代碼是錯誤的,因爲 D1 試圖繼承 B1,而 B1 則聲明爲 final。很像 Java,不是嗎?當然!還有另外的用法:

這段代碼又會出錯,因爲D2::f重寫了B2::f,但是B2::f卻被聲明爲 final 的!

下面再看另外一段代碼:

開發 D3 的程序員真的想重寫B3::f函數嗎?還是說,他只是不小心寫了個與父類同名的函數,卻在不經意間導致了覆蓋?爲了避免這種錯誤,C++ 11 引入了override關鍵字(多麼像 C# 啊!)。於是,我們會發現,下面的一段代碼是會出錯的:

多虧了override關鍵字,我們可以讓編譯器幫我們檢測到這個很難發現的程序錯誤。這段代碼的錯誤在於,override關鍵字表明,g(double)雖然想要進行override的操作,但實際父類並沒有這麼個函數。

值得注意的是,這些並不是一些語法糖,而是能確確實實地避免很多程序錯誤,並且暗示編譯器可以作出一些優化。調用標記了finalvirtual函數,例如上面的B2::f,GNU C++ 前端會識別出,這個函數不能被覆蓋,因此會將其從類的虛表中刪除。而標記爲final的類,例如上面的 B1,編譯器則根本不會生成虛表。這樣的代碼顯然更有效率。

發佈了47 篇原創文章 · 獲贊 13 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章