在物件導向的c++語言中,虛函式(virtual function)是乙個非常重要的概念。因為它充分體現了物件導向思想中的繼承和多型性這兩大特性,在c++語言裡應用極廣。比如在微軟的mfc類庫中,你會發現很多函式都有virtual關鍵字,也就是說,它們都是虛函式。難怪有人甚至稱虛函式是c++語言的精髓。
那麼,什麼是虛函式呢,我們先來看看微軟的解釋:
虛函式是指乙個類中你希望過載的成員函式,當你用乙個基類指標或引用指向乙個繼承類物件的時候,你呼叫乙個虛函式,實際呼叫的是繼承類的版本。
——摘自msdn
這個定義說得不是很明白。msdn中還給出了乙個例子,但是它的例子也並不能很好的說明問題。我們自己編寫這樣乙個例子:
#include "stdio.h"
#include "conio.h"
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* argv)
用任意版本的visual c++或borland c++編譯並執行,輸入乙個小寫字母c,得到下面的結果:
this is parent,function1
this is child,function2
為什麼會有第一行的結果呢?因為我們是用乙個parent類的指標呼叫函式fuction1(),雖然實際上這個指標指向的是child類的物件,但編譯器無法知道這一事實(直到執行的時候,程式才可以根據使用者的輸入判斷出指標指向的物件),它只能按照呼叫parent類的函式來理解並編譯,所以我們看到了第一行的結果。那麼第二行的結果又是怎麼回事呢?我們注意到,function2()函式在基類中被virtual關鍵字修飾,也就是說,它是乙個虛函式。虛函式最關鍵的特點是「動態聯編」,它可以在執行時判斷指標指向的物件,並自動呼叫相應的函式。
如果我們在執行上面的程式時任意輸入乙個非c的字元,結果如下:
this is parent,function1
this is parent,function2
請注意看第二行,它的結果出現了變化。程式中僅僅呼叫了乙個function2()函式,卻可以根據使用者的輸入自動決定到底呼叫基類中的function2還是繼承類中的function2,這就是虛函式的作用。我們知道,在mfc中,很多類都是需要你繼承的,它們的成員函式很多都要過載,比如編寫mfc應用程式最常用的cview::ondraw(cdc*)函式,就必須過載使用。把它定義為虛函式(實際上,在mfc中ondraw不僅是虛函式,還是純虛函式),可以保證時刻呼叫的是使用者自己編寫的ondraw。虛函式的重要用途在這裡可見一斑。ps:一定要注意「靜態聯翩 」和「 動態聯編 」的區別,對於我來說,若沒有在vc6.0中親自去測試,憑自己的感覺,當在鍵盤中輸入「c」時,我會覺得由於有
p=&child;
這一句**,我會認為結果都是
this is child,function1
this is child,function2
但實際結果卻是
this is parent,function1
this is child,function2
因為雖然實際上這個指標指向的是child類的物件,但編譯器無法知道這一事實,它只能按照呼叫parent類的函式來理解並編譯,所以我們看到了第一行的結果。
第二行中呼叫了子類的function2,完全是因為virtual 的功能,virtual實現了動態聯編,
它可以在執行時判斷指標指向的物件,並自動呼叫相應的函式。當然,如果執行的是
p=&parent;
這一句,該指標很明顯的是指向父類,那麼肯定呼叫的是父類的方法
C 中virtual(虛函式)的用法 詳解
在物件導向的c 語言中,虛函式 virtual function 是乙個非常重要的概念。虛函式是指乙個類中你希望過載的成員函式 當你用乙個 基類指標或引用 指向乙個繼承類物件的時候,呼叫乙個虛函式時,實際呼叫的是繼承類的版本。摘自msdn 舉例 include using namespace std...
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...