C 多型, 虛函式, 純虛函式

2021-09-25 04:59:28 字數 1455 閱讀 2646

多型:不同物件接收相同的訊息產生不同的動作。多型包括 編譯時多型和 執行時多型

執行時多型是:通過繼承和虛函式來體現的。

編譯時多型:運算子過載上。

封裝可以隱藏實現細節,使得**模組化;繼承可以擴充套件已存在的**模組(類);它們的目的都是為了——**重用。多型也有**重用的功能,還有解決專案中緊耦合的問題,提高程式的可擴充套件性。c++實現多型的機制很簡單,在繼承體系下,將父類的某個函式給成虛函式(即加上virtual關鍵字),在派生類中對這個虛函式進行重寫,利用父類的指標或引用呼叫虛函式。通過指向派生類的基類指標或引用,訪問派生類中同名覆蓋成員函式。對於虛函式呼叫來說,每乙個物件內部都有乙個虛表指標,在構造子類物件時,執行建構函式中進行虛表的建立和虛表指標的初始化,該虛表指標被初始化為本類的虛表。所以在程式中,不管你的物件型別如何轉換,但該物件內部的虛表指標是固定的,所以呢,才能實現動態的物件函式呼叫,這就是c++多型性實現的原理。

需要注意的幾點總結(基類有虛函式):

1、每乙個類都有虛表,單繼承的子類擁有一張虛表,子類物件擁有乙個虛表指標;若子類是多重繼承(同時繼承多個基類),則子類維護多張虛函式表(針對不同基類構建不同虛表),該子類的物件也將包含多個虛表指標。

2、虛表可以繼承,如果子類沒有重寫虛函式,那麼子類虛表中仍然會有該函式的位址,只不過這個位址指向的是基類的虛函式實現。如果基類3個虛函式,那麼基類的虛表中就有三項(虛函式位址),派生類也會有虛表,至少有三項,如果重寫了相應的虛函式,那麼虛表中的位址就會改變,指向自身的虛函式實現。如果派生類有自己的虛函式,那麼虛表中就會新增該項。

3、派生類的虛表中虛函式位址的排列順序和基類的虛表中虛函式位址排列順序相同。

第二:編譯器會在每個物件的前四個位元組中儲存乙個虛表指標,即(vptr),指向物件所屬類的虛表。在程式執行時的合適時機,根據物件的型別去初始化vptr,從而讓vptr指向正確的虛表,從而在呼叫虛函式時,能找到正確的函式。

第三:所謂的合適時機,在派生類定義物件時,程式執行會自動呼叫建構函式,在建構函式中建立虛表並對虛表初始化。在構造子類物件時,會先呼叫父類的建構函式,此時,編譯器只「看到了」父類,並為父類物件初始化虛表指標,令它指向父類的虛表;當呼叫子類的建構函式時,為子類物件初始化虛表指標,令它指向子類的虛表。

虛函式: 在基類中用virtual的成員函式。允許在派生類中對基類的虛函式重新定義。

基類的虛函式可以有函式體,基類也可以例項化。

虛函式要有函式體,否則編譯過不去。

虛函式在子類中可以不覆蓋。

建構函式不能是虛函式。

純虛函式:基類中為其派生類保留乙個名字,以便派生類根據需要進行定義。

包含乙個純虛函式的類是抽象類。

純虛函式後面有 = 0;

抽象類不可以例項化。但可以定義指標。

如果派生類如果不是先基類的純虛函式,則仍然是抽象類。

抽象類可以包含虛函式。

多型,虛函式,純虛函式

多型 借助虛函式,基類指標既可以使用基類 父類 的成員函式,也可以使用派生類 子類 的成員函式,它有多種形態,或多種表現方式,這就是多型 簡單說就是同一條語句可以執行不同的操作,看起來有不同表現方式,這就是多型。多型存在的三個條件 注意 派生類 子類 中的虛函式必須覆蓋 不是過載 基類 父類 中的虛...

C 多型 虛函式 純虛函式和抽象函式

多型 虛函式 純虛函式和抽象函式 多型按字面的意思就是多種形態。當類之間存在層次結構,並且類之間是通過繼承關聯時,就會用到多型。c 多型意味著呼叫成員函式時,會根據呼叫函式的物件的型別來執行不同的函式。其主要是函式的多種形態 乙個函式實現多種功能,形式是乙個乙個覆蓋。例項如下 includeusin...

C 虛函式 純虛函式

1 基本概念 虛函式是在基類中使用關鍵字virtual宣告的函式。在派生類中重新定義基類中定義的虛函式時,會告訴編譯器不要靜態鏈結到該函式。我們想要的是在程式中任意點可以根據所呼叫的物件型別來選擇呼叫的函式,這種操作被稱為動態鏈結,或後期繫結。您可能想要在基類中定義虛函式,以便在派生類中重新定義該函...