C 中virtual(虛函式)的用法 詳解

2021-09-25 14:50:05 字數 1757 閱讀 5336

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

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

舉例:

#include

using namespace std;

class parent

parent;

void parent:

:function1()

void parent:

:function2()

class child:public parent

child;

void child:

:function1()

void child:

:function2()

intmain

(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:一定要注意「靜態聯翩 」和「 動態聯編 」的區別;對於我來說,若沒有在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;  //這一句,該指標很明顯的是指向父類,那麼肯定呼叫的是父類的方法
參考文件:

C 中virtual(虛函式)的用法

在物件導向的c 語言中,虛函式 virtual function 是乙個非常重要的概念。因為它充分體現了物件導向思想中的繼承和多型性這兩大特性,在c 語言裡應用極廣。比如在微軟的mfc類庫中,你會發現很多函式都有virtual關鍵字,也就是說,它們都是虛函式。難怪有人甚至稱虛函式是c 語言的精髓。那...

virtual虛函式的用法

根據虛函式的不同位置,有著不同的作用。大致分為3類 虛擬繼承,虛函式,純虛函式 1 虛擬繼承 class a class b virtual public a class c virtual public a class d public c,public b int main int argc,c...

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

在物件導向的c 語言中,虛函式 virtual function 是乙個非常重要的概念。什麼是虛函式 虛函式是指乙個類中你希望過載的成員函式 當你用乙個基類指標或引用指向乙個繼承類物件的時候,呼叫乙個虛函式時,實際呼叫的是繼承類的版本。include using namespace std clas...