虛函式與多型

2021-09-24 16:13:10 字數 2440 閱讀 4195

c++中的虛函式的作用主要是實現了多型的機制。

虛函式是一種在基類定義為virtual的函式,並在乙個或多個派生類中再定義的函式。虛函式的特點是,只要定義乙個基類的指標,就可以指向派生類的物件。

注:無虛函式時,遵循以下規則:c++規定,定義為基類的指標,也能作指向派生類的指標使用,並可以用這個指向派生類物件的指標訪問繼承來的基類成員;但不能用它訪問派生類的成員。

使用虛函式實現執行時的多型性的關鍵在於:必須通過基類指標訪問這些函式。

一旦乙個函式定義為虛函式,無論它傳下去多少層,一直保持為虛函式。

把虛函式的再定義稱為過載(overriding)而不叫過載(overloading)。

純虛函式:是定義在基類中的一種只給出函式原型,而沒有任何與該基類有關的定義的函式。純虛函式使得任何派生類都必須定義自己的函式版本。否則編譯報錯。

純虛函式定義的一般形式:

virtual type func_name(引數列表)=0;

含有純虛函式的基類稱為抽象基類。抽象基類又乙個重要特性:抽象類不能建立物件。但是抽象基類可以有指向自己的指標,以支援執行時的多型性。

使用虛函式時,有兩點要注意,如下所述 。

1 )只能用 virtual 關鍵宇宣告類的成員函式,使它成為虛函式,而不能將類外的普通函

數宣告為虛函式。 因為虛函式的作用是允許在派生類中對基類的虛函式重新定義 。 顯然,它

只能用於類的繼承層次結構中 。

2 ) 乙個成員函式被宣告為虛函式後,在同 一類族中的類就不能再定義乙個非 virtua l 的

但與該虛函式具有相同的引數(包括個數和型別)和函式返回值型別的同名函式。

#includeusing namespace std;

class base

};class deriv_1:public base

};class deriv_2:public base

};int main()

輸出:

我是基類!

我是子類deriv_1

我是子類deriv_2

當乙個類帶有虛函式時 i 編譯

系統會為該類構造乙個虛函式表,它是乙個指標陣列,用於存放每個虛函式的人口位址 。 系

統在進行動態關聯時的時間開銷是很少的,因此,多型是高效的 。

多型的概念

同一種東西在不同場景下的多種形態,當類之間存在層次結構,並且類之間是通過繼承關聯時,就會用到多型。比如舉個例子:見人說人話,見鬼說鬼話

.動態多型的分類

靜態多型

靜態多型是編譯器在編譯期間完成的,編譯器根據函式實參的型別(可能會進行隱式型別的轉換),可推斷出要呼叫哪個函式,如果有對應的函式就呼叫該函式,否則出現編譯錯誤。

(1)動態多型的實現條件:

基類中必須包含虛函式,並且派生類一定要對基類中的虛函式進行重寫

通過基類物件的指標或引用呼叫虛函式

所謂重寫是:a.基類函式必須為虛函式,b.派生類函式必須與基類中的虛函式保持一致(包括返回型別、函式名稱、引數列表) 但是有例外:即協變:

第一種是:基類虛函式必須返回基類物件的指標/引用,派生類虛函式返回派生類物件的指標/引用   

第二種是:虛擬的析構函式(基類和派生類的析構函式名字不相同)  

第三種是:派生類的虛函式可以與基類中的虛函式訪問限定符不一樣。

第乙個p->foo()和p->fuu()都很好理解,本身是基類指標,指向的又是基類物件,呼叫的都是基類本身的函式,因此輸出結果就是1、2。

第二個輸出結果就是1、4。p->foo()和p->fuu()則是基類指標指向子類物件,正式體現多型的用法,p->foo()由於指標是個基類指標,指向是乙個固定偏移量的函式,因此此時指向的就只能是基類的foo()函式的**了,因此輸出的結果還是1。而p->fun()指標是基類指標,指向的fun是乙個虛函式,由於每個虛函式都有乙個虛函式列表,此時p呼叫fun()並不是直接呼叫函式,而是通過虛函式列表找到相應的函式的位址,因此根據指向的物件不同,函式位址也將不同,這裡將找到對應的子類的fun()函式的位址,因此輸出的結果也會是子類的結果4。

降低了程式執行效率(多型需要去找虛表的位址) 

空間浪費。

虛函式與多型

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

虛函式與多型

多型性 呼叫同乙個函式名,可以根據需要實現不同的功能。虛函式 可以在程式執行時通過呼叫相同的函式名而實現不同功能的函式稱為虛函式。編譯時的多型性 函式過載 執行時的多型性 虛函式 執行時的多型性是指在程式執行之前,根據函式名和引數無法確定應該呼叫哪乙個函式,必須在程式的執行過程中,根據具體的執 況來...

虛函式與多型

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