C 11 理解 十 之 顯式虛函式過載

2021-06-18 01:20:57 字數 1013 閱讀 8914

在 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;宣告一新的虛函式,同時也表明禁止派生函式改寫原虛函式。

overridefinal都不是語言關鍵字(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...