第四章 虛函式和多型

2021-04-13 05:46:47 字數 1334 閱讀 7366

第四章 虛函式和多型

多型性與前面提到的資料封裝和繼承性共同構成了物件導向程式設計的三個重要機制。

由於函式過載的存在,當程式中出現呼叫同名函式時,編譯器會根據函式的引數型別、個數決定呼叫執行哪乙個同名函式的**,這種把乙個函式的呼叫與適當的函式實現**聯絡在一起的過程,叫做聯編。根據聯編的實現階段的不同,可將其分為靜態聯編和動態聯編兩種。

靜態聯編是在程式編譯階段確定乙個函式呼叫與函式實現**間的對應關係,這種對應關係確定下來後,在程式執行過程中就根據這個對應關係去呼叫執行相應的函式**,並且這種對應關係在程式執行過程中始終保持不變。

而動態聯編是在編譯階段不能決定執行哪個同名的被調函式,只在程式執行過程中根據需要處理的物件型別來決定執行哪個類的成員函式。

所謂多型性就是指同樣的訊息被類的不同物件接收時導致的完全不同的行為的一種現象。這裡所說的訊息即對類的成員函式的呼叫。

函式的過載可以實現多型性,但這裡要講的多型性是通過虛函式來實現的,而虛函式又必須存在於繼承的環境下。

c++語言支援兩種型別的多型:一種是編譯時的多型(靜態多型),另一種是執行時的多型(動態多型)。在編譯時的多型是通過靜態聯編實現的,而在執行時的多型則是通過動態聯編實現的。

宣告虛函式的方法是在基類中的成員函式原型前加上關鍵字virtual。格式如下:

class 類名;

當乙個類的成員函式宣告為虛函式後,這就意味著該成員函式在派生類中可能有不同的實現,也就是說,該函式在派生類中可能需要定義與其基類虛函式原型相同的函式。

虛函式是動態聯編的基礎,當用基類型別的指標或引用的方法指向不同派生類物件時,系統會在程式執行中根據所指向物件的不同自動選擇適當的函式,從而實現了執行時的多型性。

當通過基類指標或引用標識物件並呼叫成員函式時,由於基類指標可以指向該基類的不同派生類物件,因此存在需要動態聯編的可能性,但具體是否使用動態聯編,還要看所呼叫的是否是虛函式。

虛函式可以在乙個或多個派生類中被重新定義,但它要求在派生類中重新定義時必須與基類中的函式原型完全相同,包括函式名、返回值型別、引數個數和引數型別的順序。

只有類的成員函式才能宣告為虛函式,但類的建構函式以及全域性函式和靜態成員函式不能宣告為虛函式。

指向基類的指標自然可以指向其公有派生類的物件。但是,由於基類指標本身的型別並沒有改變,因此,基類指標僅能訪問派生類中的基類部分。

在定義乙個表達抽象概念的基類時,有時可能會無法給出某些成員函式的具體實現。這時,就可以將這些函式宣告為純虛函式。

純需函式的宣告格式如下:

virtual 型別 函式名(參數列)=0;

宣告了純虛函式的基類只是用於繼承,僅作為乙個介面,具體功能在其派生類中實現。

宣告了純虛函式的類,稱為抽象類。抽象類只能用作基類來派生新類,而不能用來建立物件。

第四章 函式

樣例1,不帶引數的函式 create or replace function helloworld return varchar2 is begin return 朋友,您好 end 呼叫函式 語句的呼叫 select helloworld from dual 第二種呼叫方法 pl sql塊 beg...

第四章 函式

知識點 1 函式 function 可接受輸入 執行指令 返回輸出的復合語句。呼叫函式,意味著提供輸入。每乙個輸入就是乙個引數,為函式提供引數稱之為 傳參 2 呼叫函式的語句 函式名 逗號分隔的引數 f x x 2 語句左側定義乙個函式 f 接受乙個引數 x 右側是函式具體定義,利用 x 中傳遞的引...

《C 程式設計風格》第四章 虛函式

我們還要進一步提出問題 派生類和基類是否有著同樣的行為?使用虛函式的開銷是難以確定的 包含虛函式的類中存在虛指標,指向乙個描述虛函式的表。很簡單,題目就不寫了。答案 是因為group是直接賦值得到的,沒有申請記憶體,自然也不需要刪除了。最後附上本章中研究的 前後對比。最初的 略有修改 include...