C 多型及其實現原理

2022-03-30 06:04:38 字數 1573 閱讀 7122

1.多型的定義:多型含義為乙個事物有多種形態。在c ++程式設計中,多型性是指具有不同功能的函式可以用同乙個函式名,這樣就可以用乙個函式名呼叫不同內容的函式,主要分為靜態多型和動態多型;

動態多型:就是通過繼承重寫基類的虛函式實現的多型,因為是在執行時確定決議,所以稱為動態多型。執行時在虛函式表中尋找呼叫函式的位址。

2.多型的現象:當子類中重寫了父類的虛函式,那麼通過父類的指標或者引用指向父類物件或著子類物件;用該父類指標或者引用呼叫父子中被重寫的函式;就會有父類指標指向父類物件,呼叫的是父類中的虛函式;父類指標指向的是子類物件,呼叫的是子類虛函式;此時,也符合賦值相容規則;不貴父類的指標或者引用指向父類物件或者子類物件;這個父類指標或者引用都只能訪問父類的部分。

3.動態多型原理:動態多型依靠執行時的型別檢查來進行函式的遲繫結。宣告乙個類時,如果類中有虛方法,則自動在類中增加乙個虛函式指標,該指標指向的是乙個虛函式表,虛函式表中存著每個虛函式真正對應的函式位址。動態多型採用一種延遲繫結技術,普通的函式呼叫,在編譯期間就已經確定了呼叫的函式的位址,所以無論怎樣呼叫,總是那個函式,但是擁有虛函式的類,在呼叫虛函式時,首先去查虛函式表,然後再確定呼叫的是哪乙個函式,所以,呼叫的函式是在執行時才會確定的。

·   當指向父類的物件時,由於本身是父類指標;且父類物件模型中的虛函式表指標所指向的虛函式表中只存放父類的虛函式位址;所以父類的指標呼叫的重寫虛函式時父類的虛函式;

·   當父類指標指向子類物件時,此時子類物件中的(父類的虛函式表指標)所指的虛函式表中的(父類重寫虛函式的位址)被改寫為(子類的重寫虛函式的位址),所以此時父類指標訪問子類中父類的虛函式表時,找到的要呼叫的同名虛函式的位址就是子類的同名虛函式位址;所以父類指標呼叫就是子類的重寫的同名虛函式;

虛函式重寫(覆蓋)的實質就是重寫父類虛函式表中的父類虛函式位址;

4.虛表指標初始化問題,當建立子類物件時,編譯器的執行順序:

·   物件在建立時,由編譯器對vptr 進行初始化

·   子類的構造會先呼叫父類的建構函式,這個時候vptr 會先指向父類的虛函式表

·   子類構造的時候,vptr 會再指向子類的虛函式表(這也就是在父類或者子類的建構函式中呼叫虛成員函式不會實現多型的原因)

·   物件的建立完成後,vptr 最終的指向才確定

5.c++類繼承中的建構函式和析構函式和多型的關係

a.建構函式不能實現多型:

子類的構造會先呼叫父類的建構函式,這個時候vptr 會先指向父類的虛函式表;子類構造的時候,vptr 會再指向子類的虛函式表;

b.    析構函式可以實現多型:

在用基類指標指向派生類時,在基類析構函式宣告為virtual的時候,delete基類指標,會先呼叫派生類的析構函式,再呼叫基類的析構函式;

c.     注意事項:在基類析構函式沒有宣告為virtual的時候,delete基類指標,只會呼叫基類的析構函式,而不會呼叫派生類的析構函式,這樣會造成銷毀物件的不完全;

c 中多型及其實現原理

有繼承 有虛函式 virtual 重寫 有父類指標 引用 指向子類物件。在基類中使用virtual定義虛函式,告訴編譯器這個函式要支援多型 而不是根據指標型別判斷如何呼叫 而是要根據引用或指標所繫結的物件的真實型別。一旦某個函式被宣告為虛函式,則在所有派生類中它都是虛函式 不管有沒有virtual ...

C C 多型及其實現原理

c c 多型及其實現原理 多型的介紹 多型含義為乙個事物有多種形態。在c 程式設計中,多型性是指具有不同功能的函式可以用同乙個函式名,這樣就可以用乙個函式名呼叫不同內容的函式。一般來說多型分為兩種 靜態多型 也稱為編譯時多型,主要包括引數多型,過載多型和強制多型。引數多型 採用引數化模板,通過給出不...

LFU原理及其實現(C )

讀完本文,你不僅學會了演算法思路,還可以順便去 leetcode 上拿下如下題目 460.lfu快取機制 lru 演算法的淘汰策略是 least recently used,也就是每次淘汰那些最久沒被使用的資料 而 lfu 演算法的淘汰策略是 least frequently used,也就是每次淘...