多型與虛函式的概念

2021-08-03 20:25:21 字數 2565 閱讀 3616

1.多型:在物件導向方法中一般是這樣表述多型性的:向不同的物件傳送同乙個訊息,不同的物件在接收時會產生不同的行為(即方法)。也可以說,多型性是「乙個介面,多種方法」。

2.從系統實現的角度看,多型性分為兩類:靜態多型性和動態多型性。以前學過的函式過載和運算子過載實現的多型性屬於靜態多型性,動態多型性是通過虛函式(virtual function)實現的。

3.靜態多型性是指:在程式編譯時系統就能決定呼叫的是哪個函式,因此靜態多型性又稱編譯時的多型性。動態多型性是在程式執行過程中才動態地確定操作所針對的物件。它又稱執行時的多型性

1.虛函式的作用是:允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式

2.虛函式的使用方法:

(1) 在基類用virtual宣告成員函式為虛函式。這樣就可以在派生類中重新定義此函式,為它賦予新的功能,並能方便地被呼叫。在類外定義虛函式時,不必再加virtual。

(2) 在派生類中重新定義此函式,要求函式名、函式型別、函式引數個數和型別全部與基類的虛函式相同,並根據派生類的需要重新定義函式體。c++規定,當乙個成員函式被宣告為虛函式後,其派生類中的同名函式都自動成為虛函式

(3) 定義乙個指向基類物件的指標變數,並使它指向同一類族中需要呼叫該函式的物件。

(4) 通過該指標變數呼叫此虛函式,此時呼叫的就是指標變數指向的物件的同名函式。

3.什麼情況下應當宣告虛函式

(1) 首先看成員函式所在的類是否會作為基類。然後看成員函式在類的繼承後有無可能被更改功能,如果希望更改其功能的,一般應該將它宣告為虛函式。

(2) 如果成員函式在類被繼承後功能不需修改,或派生類用不到該函式,則不要把它宣告為虛函式。不要僅僅考慮到要作為基類而把類中的所有成員函式都宣告為虛函式。

(3) 應考慮對成員函式的呼叫是通過物件名還是通過基類指標或引用去訪問,如果是通過基類指標或引用去訪問的,則應當宣告為虛函式。

需要說明的是: 使用虛函式,系統要有一定的空間開銷。當乙個類帶有虛函式時,編譯系統會為該類構造乙個虛函式表(virtual function table,簡稱vtable),它是乙個指標陣列,存放每個虛函式的入口位址。系統在進行動態關聯時的時間開銷是很少的,因此,多型性是高效的。

4.虛函式與過載的區別:

以前介紹的函式過載處理的是同一層次上的同名函式問題,而虛函式處理的是不同派生層次上的同名函式問題,前者是橫向過載,後者可以理解為縱向過載。但與過載不同的是: 同一類族的虛函式的首部是相同的,而函式過載時函式的首部是不同的(引數個數或型別不同)。

5.虛析構函式:

(1)析構函式的作用是在物件撤銷之前做必要的「清理現場」的工作。當派生類的物件從記憶體中撤銷時一般先呼叫派生類的析構函式,然後再呼叫基類的析構函式。但是用new 和delete建立和釋放物件的時候,系統只執行基類的析構函式,而不會執行派生類的析構函式。

(2)如果將基類的析構函式宣告為虛函式時,由該基類所派生的所有派生類的析構函式也都自動成為虛函式,即使派生類的析構函式與基類的析構函式名字不相同。

(3)最好把基類的析構函式宣告為虛函式。這將使所有派生類的析構函式自動成為虛函式。這樣,如果程式中顯式地用了delete運算子準備刪除乙個物件,而delete運算子的操作物件用了指向派生類物件的基類指標,則系統會呼叫相應類的析構函式。說明:建構函式不能宣告為虛函式。

1.純虛函式:

(1)定義:

純虛函式是在宣告虛函式時被「初始化」為0的函式。宣告純虛函式的一般形式是:virtual 函式型別函式名(參數列列) =0;

也就如:virtual float area( ) const =0;//純虛函式

注意: ①純虛函式沒有函式體;②最後面的「=0」並不表示函式返回值為0,它只起形式上的作用,告訴編譯系統「這是純虛函式」; ③這是乙個宣告語句,最後應有分號。

(2)作用:純虛函式的作用是在基類中為其派生類保留乙個函式的名字,以便派生類根據需要對它進行定義。如果在基類中沒有保留函式名字,則無法實現多型性。

2.抽象類:

(1)定義:不用來定義物件而只作為一種基本型別用作繼承的類,稱為抽象類(abstract class),由於它常用作基類,通常稱為抽象基類(abstract base class)。

(2)凡是包含純虛函式的類都是抽象類。因為純虛函式是不能被呼叫的,包含純虛函式的類是無法建立物件的。抽象類的作用是作為乙個類族的共同基類,或者說,為乙個類族提供乙個公共介面。

(3)如果在派生類中沒有對所有純虛函式進行定義,則此派生類仍然是抽象類,不能用來定義物件。

(4)雖然抽象類不能定義物件(或者說抽象類不能例項化),但是可以定義指向抽象類資料的指標變數。當派生類成為具體類之後,就可以用這種指標指向派生類物件,然後通過該指標呼叫虛函式,實現多型性的操作。

(5)在類的層次結構中,頂層或最上面的幾層可以是抽象基類。抽象基類體現了本類族中各類的共性,把各類中共有的成員函式集中在抽象基類中宣告。

虛函式與多型

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

虛函式與多型

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

虛函式與多型

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