在 c++ 裡,在子類中容易意外的過載虛函式。舉例來說:
struct base;struct derived : base
;
derived::some_func
的真實意圖為何? 程式設計師真的試圖過載該虛函式,或這只是意外? 這也可能是base
的維護者在其中加入了乙個與derived::some_func
同名且擁有相同簽名的虛函式。
另乙個可能的狀況是,當基類中的虛函式的簽名被改變,子類中擁有舊簽名的函式就不再過載該虛函式。因此,如果程式設計師忘記修改所有子類,執行期將不會正確呼叫到該虛函式正確的實現。
c++11 將加入支援用來防止上述情形產生,並在編譯期而非執行期捕獲此類錯誤。為保持向後相容,此功能將是選擇性的。其語法如下:
struct base;struct derived : base
;
編譯器會檢查基底型別是否存在一虛函式,與派生類中帶有宣告override
的虛函式,有相同的函式簽名(signature);若不存在,則會回報錯誤。
c++11 也提供指示字final
,用來避免型別被繼承,或是基底型別的函式被改寫:
struct base1 final;struct derived1 : base1
;// 錯誤格式: class base1 以標明為 final
struct base2
;struct derived2 : base2
;
以上的示例中,virtual void f() final;
宣告一新的虛函式,同時也表明禁止派生函式改寫原虛函式。
override
與final
都不是語言關鍵字(keyword),只有在特定的位置才有特別含意,其他地方仍舊可以作為一般指示字(identifier)使用。
C 11 顯式轉換操作符
隱式型別轉換是c 的乙個既好又壞的特性。它給人以方便,但可能造成一些十分隱晦的錯誤。型別轉換提供了乙個型別向另乙個型別的構造。cpp view plain copy cpp view plain copy class x void func int intwmain 上面的 中,x可以隱式地轉換為i...
C 11新特性之虛函式的override指示符
1.c 11中新增加了許多新的特性,這裡對override這個新特性做乙個簡單的描述 override的英文意思為 覆蓋 2.下面demo中,student類繼承於people類 public公有繼承 在people類中對printinf函式進行了虛函式的宣告 為了實現多型 多型的3個條件 有繼承 ...
C 虛函式與函式過載理解分析
虛函式構建多型,函式過載通過以下方式 1,const過載 2,形參表 虛函式子類中,不能出現返回值不同的情況,除非返回值可以向上轉換 常物件優先呼叫const過載函式,非常物件優先呼叫普通函式 以以下例子分析 class sbs class base使用的是基本物件,而不是常物件,預設呼叫virtu...