虛函式的原理和使用

2022-05-03 11:36:23 字數 2418 閱讀 5773

虛函式(實現類的多型性)

這裡再解釋一下類的多型

即介面的多種不同實現方式。更直觀來說就是同一成員函式讓不同的物件使用,可以實現不同的功能。這就是多型。

虛函式的函式呼叫發生在執行階段,而不是發生在編譯階段,稱為動態聯編(動多型)。虛函式的呼叫需要間接的記憶體定址動作,從而使動態聯編的效率下降

注意:

1、非虛函式靜態聯編(靜多型),效率要比虛函式高,但是**會很臃腫。

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

虛函式的使用方法:

1、在基類用virtual宣告成員函式為虛函式。

這樣就可以在派生類中重新定義此函式,為它賦予新的功能,並能方便地被呼叫。在類外定義虛函式時,不必再加virtual

2、在派生類中重新定義此函式,要求函式名、函式型別、函式引數個數和型別全部與基類的虛函式相同,並根據派生類的需要重新定義函式體。

c++規定,當乙個成員函式被宣告為虛函式後,其派生類中的同名函式都自動成為虛函式。因此在派生類重新宣告該虛函式時,可以加virtual,也可以不加,

但習慣上一般在每一層宣告該函式時都加virtual,使程式更加清晰。如果在派生類中沒有對基類的虛函式重新定義,則派生類簡單地繼承其直接基類的虛函式。

3、定義乙個指向基類物件的指標變數,並使它指向同一類族中需要呼叫該函式的物件。

4、通過該指標變數呼叫此虛函式,此時呼叫的就是指標變數指向的物件的同名函式。

通過虛函式與指向基類物件的指標變數的配合使用,就能方便地呼叫同一類族中不同類的同名函式,只要先用基類指標指向即可。

如果指標不斷地指向同一類族中不同類的物件,就能不斷地呼叫這些物件中的同名函式。這就如同前面說的,不斷地告訴計程車司機要去的目的地,

然後司機把你送到你要去的地方。   

1、重寫,重寫是針對與虛函式的,即子類的同名函式重寫父類的同名虛函式;而覆蓋是針對於一般函式的

2、虛指標對於函式成員而不能使用於資料成員

3、子類重寫的函式,即跟父類虛函式同名的函式,預設是虛函式,可以顯式的加上virtual,也可以不加

4、重寫要求較高,要求兩個函式的輸入引數得相同,同時在大部分情況下,也要求返回值的型別相同,除非協變,返回值是當前的類、類指標或類引用

5、虛函式不能是內聯函式,就算寫了inline關鍵字,系統也不認,沒有任何作用

6、建構函式不能是虛函式

舉個例子:實現乙個求面積的功能

#includeusing

namespace

std;

//求面積

classs};

//求圓面積

class aclass:publics};

//求三角形面積

class bclass :publics};

//求矩形面積

class cclass :publics};

intmain()

輸出

虛表:

虛表就是乙個列表,裡面存放的是父類中的虛函式的位址,當建立物件的時候,如果發現有重寫,就將子類的虛函式的位址覆蓋原來父類虛函式的位址。0代表虛表的結尾

虛表建立在編譯過程,虛函式指標是在執行階段確定的

具體執行過程:

1)編譯器在編譯父類時,發現乙個函式是虛函式,就將起位址存放到虛表中,依次將虛函式的位址存放進去

2)在建立乙個新的子類物件時,即new 子類名時,檢測子類中函式有沒有與父類中的虛函式同名的,如果有,就將子類中的這個函式的位址存放在原來存放父類同名虛函式的虛表位置上,覆蓋原來父類虛函式的位址

3)當指標物件呼叫乙個父類中的函式時,如果檢測到這個函式是虛函式,則就去虛表裡面查詢這個虛函式的位址,然後轉去相應的位址上去執行

4)虛表是屬於類,同乙個類的不同物件使用同乙個虛表,在派生類只會繼承基類的虛指標

類物件空間最開始四個位元組就是虛表(虛函式列表)的位址,叫虛指標,c++中虛表指標是放在類物件的開頭,虛指標指向乙個虛表,虛表中記錄了虛基類與本類的位址偏移,通過這個位址偏移可以找到虛基類的成員指標的位址

C 虛析構和虛函式的原理

c 中的虛函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有 多種形態 這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的 來實現可變的演算法。比如 模板技術,rtti技術,虛函式技術,...

C 虛函式和虛析構函式的使用

main.cpp c test12 include using namespace std class a a virtual a void funa void funb virtual void funb void a funa void a funb class b public a b voi...

C 虛函式與虛函式的工作原理

虛函式的工作原理 獲取物件的虛函式表位址 給類函式宣告virtual關鍵字,將該函式解釋為虛函式。基類定義的虛函式表明子類可以繼承並實現該虛函式。虛函式的最大作用為 可以通過基類指標或引用來接收乙個子類指標或者引用,並通過基類指標或引用來呼叫虛函式來實現相同的動作不同的實現方式,達到多型的目的。例子...