虛函式的作用

2021-09-25 10:44:10 字數 1792 閱讀 4938

#include #include #include "conio.h"

using namespace std;

/***************************

* 虛函式例項

* 使用說明:虛函式是是指乙個類中你希望過載的函式

* 當你用乙個基類的指標或者引用,指向乙個繼承

* 類的時候,呼叫乙個乙個虛函式時,實際呼叫的

* 是繼承類的版本。

* 學習**:

* **************************/

//定義乙個父類

class parent

parent;

void parent::function1()

void parent::function2()

class child:public parent

child;

void child::function1()

void child::function2()

//test

int main()

在qt4.2.1編譯並執行,輸入乙個小寫字母c,得到下面的結果:

1 this is parent,function1

2 this is child,function2

demo analysis:

為什麼會有第一行的結果呢?

因為我們是用乙個parent類的指標呼叫函式fuction1(),雖然實際上這個指標指向的是child類的物件,但編譯器無法知道這一事實(直到執行的時候,程式才可以根據使用者的輸入判斷出指標指向的物件),它只能按照呼叫parent類的函式來理解並編譯,所以我們看到了第一行的結果。

那麼第二行的結果又是怎麼回事呢?我們注意到,function2()函式在基類中被virtual關鍵字修飾,也就是說,它是乙個虛函式。

虛函式最關鍵的特點是「動態聯編」,它可以在執行時判斷指標指向的物件,並自動呼叫相應的函式。

如果我們在執行上面的程式時任意輸入乙個非c的字元,結果如下:
1 this is parent,function1

2 this is parent,function2

請注意看第二行,它的結果出現了變化。程式中僅僅呼叫了乙個function2()函式,卻可以根據使用者的輸入自動決定到底呼叫基類中的function2還是繼承類中的function2,這就是虛函式的作用。
ps:一定要注意「靜態聯翩 」和「 動態聯編 」的區別;對於我來說,若沒有在vc6.0中親自去測試,憑自己的感覺,

當在鍵盤中輸入「c」時,我會覺得由於有p=&child;這一句**,我會認為結果都是:

1 this is child,function1

2 this is child,function2

但是結果卻是:

1 this is parent,function1

2 this is child,function2

因為雖然實際上這個指標指向的是child類的物件,但編譯器無法知道這一事實,它只能按照呼叫parent類的函式來理解並編譯,所以我們看到了第一行的結果。

第二行中呼叫了子類的function2,完全是因為virtual 的功能,virtual實現了動態聯編,它可以在執行時判斷指標指向的物件,並自動呼叫相應的函式。1 p=&parent; //這一句,該指標很明顯的是指向父類,那麼肯定呼叫的是父類的方法

虛函式的作用

虛函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式。例 基類與派生類中有同名函式。在下面的程式中student是基類,graduate是派生類,它們都有display這個同名的函式。include include using namespa...

虛函式的作用

虛函式的作用是實現動態聯編,也就是在程式的執行階段動態地選擇合適的成員函式,在定義了虛函式後,可以在基類的派生類中對虛函式重新定義,在派生類中重新定義的函式應與虛函式具有相同的形參個數和形參型別。以實現統一的介面,不同定義過程。如果在派生類中沒有對虛函式重新定義,則它繼承其基類的虛函式。當程式發現虛...

虛函式的作用

虛函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式。例 基類與派生類中有同名函式。在下面的程式中student是基類,graduate是派生類,它們都有display這個同名的函式。include include using namespa...