虛函式的作用及其底層實現機制

2021-07-23 06:17:35 字數 1435 閱讀 3842

虛函式: 實現類的多型性

關鍵字:虛函式;虛函式的作用;多型性;多型公有繼承;動態聯編

c++中的虛函式的作用主要是實現了多型的機制

。基類定義虛函式,子類可以重寫該函式;在派生類中對基類定義的虛函式進行重寫時,需要再派生類中宣告該方法為虛方法。

當子類重新定義了父類的虛函式後,當父類的指標指向子類物件的位址時,[即b b; a a = &b;] 父類指標根據賦給它的不同子類指標,動態的呼叫子類的該函式,而不是父類的函式(如果不使用virtual方法,請看後面★*),且這樣的函式呼叫發生在執行階段,而不是發生在編譯階段,稱為

動態聯編

。而函式的過載可以認為是多型,只不過是靜態的

。注意,非虛函式靜態聯編,效率要比虛函式高,但是不具備動態聯編能力。

★如果使用了virtual關鍵字,程式將根據引用或指標指向的 對 象 類 型 來選擇方法,否則使用引用型別或指標型別來選擇方法。

下面的例子解釋動態聯編性:

class a;

virtual void fun1();

virtual void fun2();

};class b : public a;

virtual void fun2();// 重寫了基類的方法

};// 為方便解釋思想,省略很多**

a a(1);

b b(2);

a *a1_ptr = &a;

a *a2_ptr = &b;

//當派生類「重寫」了基類的虛方法,呼叫該方法時

// 程式根據 指標或引用 指向的 「物件的型別」來選擇使用哪個方法

a1_ptr->fun2();// call a::fun2();

a2_ptr->fun2();// call b::fun1();

// 否則

// 程式根據「指標或引用的型別」來選擇使用哪個方法

a1_ptr->fun1();// call a::fun1();

a2_ptr->fun1();// call a::fun1();

實現原理:虛函式表+虛表指標

關鍵字:虛函式底層實現機制;虛函式表;虛表指標

編譯器處理虛函式的方法是:為每個類物件新增乙個隱藏成員,隱藏成員中儲存了乙個指向函式位址陣列的指標

,稱為虛表指標(vptr)

,這種陣列成為虛函式表(virtual function table, vtbl),即,每個類使用乙個虛函式表,每個類物件用乙個虛表指標。

舉個例子:基類物件包含乙個虛表指標,指向基類中所有虛函式的位址表。派生類物件也將包含乙個虛表指標,指向派生類虛函式表。看下面兩種情況:

下面的體現了上述的底層實現機制:

虛函式的底層實現機制

1 多型的實現機制 c 在基類中宣告乙個帶關鍵之virtual的函式,這個函式叫虛函式 它可以在該基類的派生類中被重新定義並被賦予另外一種處理功能。通過指向指向派生類的基類指標或引用呼叫虛函式,編譯器可以根據指向物件的型別在執行時決定呼叫的目標函式。這就實現了多型。2 例項 cpp view pla...

C 虛函式及其作用

虛函式的作用 虛函式的作用主要是為了能夠實現多型而設計的。可以讓成員函式操作一般化,用基類的指標指向不同的派生類的物件時,基類指標呼叫其虛成員函式,則會呼叫其真正指向物件的成員函式,而不是基類中定義的成員函式 只要派生類改寫了該成員函式 若不是虛函式,則不管基類指標指向的哪個派生類物件,呼叫時都 會...

C 多型,虛函式作用及底層實現原理

簡述c 虛函式作用及底層實現原理 c 是物件導向程式設計,其包括3項特點 1 資料抽象 介面和實現分離 2 繼承 父類和子類 3 多型 動態繫結 本文討論多型。當父類希望子類重新定義某些函式時,用virtual關鍵字宣告為虛函式。當我們使用乙個基類型別的引用或者指標,呼叫乙個虛函式時就引發動態繫結 ...