虛函式與多型

2021-07-16 16:31:46 字數 2493 閱讀 4858

多型性:呼叫同乙個函式名,可以根據需要實現不同的功能。

虛函式:可以在程式執行時通過呼叫相同的函式名而實現不同功能的函式稱為虛函式。

編譯時的多型性(函式過載)

執行時的多型性(虛函式)

執行時的多型性是指在程式執行之前,根據函式名和引數無法確定應該呼叫哪乙個函式,必須在程式的執行過程中,根據具體的執**況來動態地確定。

虛函式

當乙個基類被繼承為不同的派生類時,各派生類可以使用與基類成員相同的成員名,如果在執行時用同乙個成員名呼叫類物件的成員,會呼叫哪個物件的成員?

編譯系統按照同名覆蓋的原則決定呼叫的物件。假如b是a的派生類,用b.area( )呼叫的是派生類b中的成員函式display。如果想呼叫b中的直接基類a的display函式,應當表

示為b.a::display( )。用這種方法來區分兩個同名的函式。但是這樣做很不方便。

人們提出這樣的設想,能否用同乙個呼叫形式,既能呼叫派生類又能呼叫基類的同名函式。在程式中不是通過不同的物件名去呼叫不同派生層次中的同名函式,而是通過指標呼叫它

們。例如,用同乙個語句「pt->display( );」可以呼叫不同派生層次中的display函式,只

需在呼叫前給指標變數pt賦以不同的值(使之指向不同的類物件)即可。

c++

中的虛函式就是用來解決這個問題的。虛函式的作用是允許在派生類中重新定義與基類

同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式。

一旦把基類的成員函式定義為虛函式,由基類所派生出來的所有派生類中,該函式均保持虛函式的特性。 只有在程式的執行過程中,依據指標具體指向哪個類物件,或依據引用哪

個類物件,才能確定啟用哪乙個版本,實現動態聚束。

(定義乙個基類的指標,基類指標賦哪一層物件名則執行哪層的函式)

c++規定,當乙個成員函式被宣告為虛函式後,其派生類中的同名函式都自動成為虛函式。

因此在派生類重新宣告該虛函式時,可以加virtual,也可以不加,但習慣上一般在每一層聲

明該函式時都加virtual,使程式更加清晰。

1、當在基類中把成員函式定義為虛函式後,在其派生類中定義的虛函式必須與基類中的虛函式同名,引數的型別、順序、引數的個數必須一一對應,函式的返回的型別也相同。若函式名相同,但引數的個數不同或者引數的型別不同時,則屬於函式的過載,而不是虛函式。若函式名不同,顯然這是不同的成員函式。

2、實現這種動態的多型性時,必須使用基類型別的指標變數,並使該指標指向不同的派生類物件,並通過呼叫指標所指向的虛函式才能實現動態的多型性。

3、虛函式必須是類的乙個成員函式,不能是友元函式,也不能是靜態的成員函式。

4、在派生類中沒有重新定義虛函式時,與一般的成員函式一樣,當呼叫這種派生類物件的虛函式時,則呼叫其基類中的虛函式。

5、可把析構函式定義為虛函式,但是,不能將建構函式定義為虛函式。

6、虛函式與一般的成員函式相比較,呼叫時的執行速度要慢一些。為了實現多型性,在每乙個派生類中均要儲存相應虛函式的入口位址表,函式的呼叫機制也是間接實現的。因此,除了要編寫一些通用的程式,並一定要使用虛函式才能完成其功能要求外,通常不必使用虛函式。

7、乙個函式如果被定義成虛函式,則不管經歷多少次派生,仍將保持其虛特性,以實現「乙個介面,多個形態」。

例子

下面是給出的一些例子,其中student是基類,graduate是student的派生類,兩者各有一個display()函式(不是過載的)。

如上面所示,定義派生類的指標,想呼叫基類的display()函式必須加上基類的限定符。

上面是在display()前加上virtual的輸出,基類指標通過直接指向派生類的物件即可呼叫

派生類的display()函式。

上面是去掉display()前的virtual的輸出,無法呼叫派生類的display()函式。

派生類的指標不可以直接指向基類的物件,反之可以。

虛函式與多型

前三者為靜態繫結,虛函式為動態繫結 動態繫結 只有通過基類指標或引用呼叫虛函式才能引發動態繫結 虛函式不能被宣告為靜態 include using namespace std class base virtual void fun2 void fun3 class derived public ba...

虛函式與多型

多型性 c 支援兩種多型性 編譯時多型性,執行時多型性 虛函式 派生類可以不顯式地用virtual宣告虛函式,這時系統就會用以下規則來判斷派生類的乙個函式成員是不是虛函式 一般習慣於在派生類的函式中也使用virtual關鍵字,以增加程式的可讀性 該函式是否與基類的虛函式有相同的名稱 引數個數及對應引...

虛函式與多型

基類的指標 因當建立乙個類的物件時會建立它的父類物件 如下 class animal class human public animal class mm public human animal a new mm 基類的指標指向派生類物件 human h new mm 父類的指標指向子類物件 因父類...