第四章虛函式和多型
多型性與前面提到的資料封裝和繼承性共同構成了物件導向程式設計的三個重要機制。
1.靜態聯編與動態聯編
由於函式過載的存在,當程式中出現呼叫同名函式時,編譯器會根據函式的引數型別、個數決定呼叫執行哪乙個同名函式的**,這種把乙個函式的呼叫與適當的函式實現**聯絡在一起的過程,叫做聯編。根據聯編的實現階段的不同,可將其分為靜態聯編和動態聯編兩種。
靜態聯編是在程式編譯階段確定乙個函式呼叫與函式實現**間的對應關係,這種對應關係確定下來後,在程式執行過程中就根據這個對應關係去呼叫執行相應的函式**,並且這種對應關係在程式執行過程中始終保持不變。
而動態聯編是在編譯階段不能決定執行哪個同名的被調函式,只在程式執行過程中根據需要處理的物件型別來決定執行哪個類的成員函式。
所謂多型性就是指同樣的訊息被類的不同物件接收時導致的完全不同的行為的一種現象。這裡所說的訊息即對類的成員函式的呼叫。
函式的過載可以實現多型性,但這裡要講的多型性是通過虛函式來實現的,而虛函式又必須存在於繼承的環境下。
c++語言支援兩種型別的多型:一種是編譯時的多型(靜態多型),另一種是執行時的多型(動態多型)。在編譯時的多型是通過靜態聯編實現的,而在執行時的多型則是通過動態聯編實現的。
宣告虛函式的方法是在基類中的成員函式原型前加上關鍵字virtual。格式如下:
class 類名;
當乙個類的成員函式宣告為虛函式後,這就意味著該成員函式在派生類中可能有不同的實現,也就是說,該函式在派生類中可能需要定義與其基類虛函式原型相同的函式。
虛函式是動態聯編的基礎,當用基類型別的指標或引用的方法指向不同派生類物件時,系統會在程式執行中根據所指向物件的不同自動選擇適當的函式,從而實現了執行時的多型性。
當通過基類指標或引用標識物件並呼叫成員函式時,由於基類指標可以指向該基類的不同派生類物件,因此存在需要動態聯編的可能性,但具體是否使用動態聯編,還要看所呼叫的是否是虛函式。
虛函式可以在乙個或多個派生類中被重新定義,但它要求在派生類中重新定義時必須與基類中的函式原型完全相同,包括函式名、返回值型別、引數個數和引數型別的順序。
只有類的成員函式才能宣告為虛函式,但類的建構函式以及全域性函式和靜態成員函式不能宣告為虛函式。
指向基類的指標自然可以指向其公有派生類的物件。但是,由於基類指標本身的型別並沒有改變,因此,基類指標僅能訪問派生類中的基類部分。
在定義乙個表達抽象概念的基類時,有時可能會無法給出某些成員函式的具體實現。這時,就可以將這些函式宣告為純虛函式。
純需函式的宣告格式如下:
virtual 型別 函式名(參數列)=0;
宣告了純虛函式的基類只是用於繼承,僅作為乙個介面,具體功能在其派生類中實現。
宣告了純虛函式的類,稱為抽象類。抽象類只能用作基類來派生新類,而不能用來建立物件。
C 學習摘要之四 虛函式和多型
多型性與前面提到的資料封裝和繼承性共同構成了物件導向程式設計的三個重要機制。1 靜態聯編與動態聯編 由於函式過載的存在,當程式中出現呼叫同名函式時,編譯器會根據函式的引數型別 個數決定呼叫執行哪乙個同名函式的 這種把乙個函式的呼叫與適當的函式實現 聯絡在一起的過程,叫做聯編。根據聯編的實現階段的不同...
C 之虛函式和多型
1.虛函式 簡單的說,虛函式就是在函式原型前加上virtual關鍵字。函式一旦被宣告為虛函式,即使類在改寫它的時候沒有將其宣告為虛函式,它從該點的繼承層次結構中仍然是虛函式。如果基類中乙個函式被宣告為虛函式,在若干子類中有著不同的實現,那麼我們在建立若干子類的不同物件時,可以用基類的指標或者引用來指...
C 多型之虛函式
問題 用基型別的指標指向派生類物件時,通過這個指標來訪問該物件,這是會出現訪問到的只是從基類繼承來的同名成員。解決方法 在基類中將這個同名函式宣告為虛函式,這樣就可以通過基型別的指標,訪問不同派生類的物件產生不同的行為,從而實現執行過程的多型。語法 virtual 函式型別 函式名 形參表 注意 必...