C 中的虛函式及其實現方式

2021-07-06 10:56:58 字數 682 閱讀 6363

首先看**,不採用虛函式的情況

//#include "stdafx.h"

#include using namespace std;

class a

void print()

};class b :public a

};int main()

上述的兩次輸出均為「this is a 100」。證明在不採用虛函式的基礎上,用父類的指標指向子類,是指向子類中父類的一部分。其行為和父類相同。

下面是採用虛函式的情況

//#include "stdafx.h"

#include using namespace std;

class a

virtual void print()

};class b :public a

};int main()

輸出為this is a 100 this is b.證明父類指標指向子類物件時,呼叫虛函式是呼叫子類中的實現。下面對虛函式的實現機理做闡釋:

如果乙個類中存在虛函式,編譯器會為該類建立乙個虛函式位址表(vtbl),儲存自己類中虛函式的位址。並為改建建立乙個指標(vptr),指向這個表。每個類的物件都會有乙個vptr,該類的所有物件公用乙個vtbl。

當執行上面的pb->print()時,系統會先獲取pb的vtbr,得到vtbl後進行分析後得出結果。

虛函式及其實現

虛函式可以在執行的過程中動態編聯,根據指標所指的物件,呼叫對應的函式 成為虛函式必須滿足兩個條件 1.函式依賴於物件呼叫 因為虛函式是儲存在虛函式表中,有乙個虛函式指標指向虛函式表,要呼叫虛函式必須通過虛函式指標,虛函式指標是儲存在物件中的。2.函式必須可定址,因為虛函式表中存放的是虛函式的入口位址...

strtok函式及其實現

標頭檔案 include 定義函式 char strtok char s,const char delim 函式說明 strtok 用來將字串分割成乙個個片段。引數s 指向欲分割的字串,引數delim 則為分割字串,當 strtok 在引數s 的字串中發現到引數delim 的分割字元時則 會將該字元...

strstr函式及其實現

判斷乙個字串裡面是否包含另外乙個字串 我們以字串為例 char str1 hello world char str2 world const char result strstr str1,str2 if result null printf 沒有找到 n else printf 找到了 n 我們先...