虛函式的覆蓋

2021-08-20 17:08:42 字數 748 閱讀 5758

今天遇到乙個挺有趣的例子來說明虛函式的覆蓋問題,**如下:

#include

using namespace std;

struct b

void g()const

};struct d:b //覆蓋b::f

void g()

};struct dd:d

void g()const

};void call(const b&b)

int main()

編譯後輸出為:

當你理解了為什麼是這樣的輸出結果後,你就會清楚繼承和虛函式機制了。

我個人的理解如下,首先類層次關係如圖:

b.f() , b.g() , d.f() , d.g() , dd.f() , dd.g() 的結果很好理解。call(b)也無需解釋。

呼叫call(d)時,因為d類中f()為虛函式覆蓋了b類的f(),所以call(d)下d.f()的執行結果為:d::f,相當於執行d類的私有函式。

而call(d)下d.g()的執行結果為b::g。

呼叫call(dd)時,因為dd類中f()函式與d類的不同,不覆蓋,所以call(dd)下dd.f()的執行結果為:d::f,相當於執行d類中的f()函式。而call(dd)下dd.g()的執行結果為b::g,因為dd類中的g()函式與d類中不同,所以再往上回溯,執行結果為b::g。

覆蓋於虛函式

函式覆蓋發生在父類與子類之間,其函式名 引數型別 返回值型別必須同父類中的相對應被覆蓋的函式嚴格一致,覆蓋函式和被覆蓋函式只有 函式體不同,當派生類物件呼叫子類中該同名函式時會自動呼叫子類中的覆蓋版本,而不是父類中的被 覆蓋函式版本,這種機制就叫做函式覆蓋。覆蓋函式,即在子類中用相同的函式名和簽名重...

虛函式 以及覆蓋

虛函式以及覆蓋 class a 分析class a中宣告乙個虛函式 f 派生類中class b 對這個虛函式進行了覆蓋,重新定義。a pa new a 中申明乙個a類得指標,並宣告乙個物件。所以 pa f 結果應該為 a b pb b pa 把基類a的指標轉化為派生類b的指標pb 但是pa並沒有變化...

虛函式,覆蓋和多型

一.函式宣告中的virtual關鍵字 形如 class 類名 的成員函式,稱為虛函式或方法 class shape 一.在子類中覆蓋基類的虛函式 如果子類的成員函式和基類的虛函式具有相同的函式原型,那麼該成員函式就也是虛函式,無論其是否帶有virtual關鍵字,且對基類的虛函式構成覆蓋 class ...