C 中 virtual 虛函式 的理解和用法

2021-09-26 21:15:11 字數 1721 閱讀 4726

在物件導向的c++語言中,虛函式(virtual function)是乙個非常重要的概念。

什麼是虛函式:

虛函式是指乙個類中你希望過載的成員函式 ,當你用乙個基類指標或引用指向乙個繼承類物件的時候,呼叫乙個虛函式時, 實際呼叫的是繼承類的版本。

#include using  namespace std;

class parent

parent;

void parent::function1()

void parent::function2()

class child:public parent

child;

void child::function1()

void child::function2()

int main(int argc, char* ar**)

用任意版本的visual c++或borland c++編譯並執行,輸入乙個小寫字母c,得到下面的結果:

1 this is parent,function1

2 this is child,function2

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

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

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

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

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

1 this is parent,function1

2 this is parent,function2

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

當在鍵盤中輸入「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;  //這一句,該指標很明顯的是指向父類,那麼肯定呼叫的是父類的方法

C 中的虛函式 virtual

在下面的程式中類derived繼承了類base class base class derived public base intmain void 第二行沒有動態繫結,呼叫函式f 這個是派生類版本的,直接輸出derived,什麼型別就是什麼型別。第三行進行了動態繫結,但是只有在呼叫虛函式的時候,動態...

C 中的虛函式virtual

在某基類中宣告 virtual 並在乙個或多個派生類中被重新定義的成員函式稱為虛函式。虛函式的作用就是實現多型性 polymorphism 多型性是將介面與實現進行分離。c 作為完全物件導向語言,所有函式並不預設為virtual,但可以在基類中宣告關鍵字virtual,就可以在其派生類中通過關鍵字o...

C 虛函式 virtual

定義虛函式 為了指明函式為虛函式,在其返回型別前面加上保留字virtual,目的是啟用動態繫結。繼承層次的根類一般都要定義虛析構函式。成員預設為非虛函式,對非虛函式的呼叫在編譯時確定。除建構函式外,任意非static成員函式都可以是虛函式。保留字virtual只在類內部的成員函式宣告 現,不能用在類...