繼承與多型

2021-09-23 08:06:54 字數 1600 閱讀 2667

多型可以理解成「乙個介面『多種形態』」

多型與非多型的實質區別就是函式位址是早繫結還是晚繫結。如果函式的呼叫,在編譯器編譯期間就可以確定函式的呼叫位址,並生產**,是靜態的,就是說位址是早繫結的。而如果函式呼叫的位址不能在編譯器期間確定,需要在執行時才確定,這就屬於晚繫結,是動多型。

在動多型過程中,會將函式的入口位址放在.rodata段,載入到記憶體中

那麼多型的作用是什麼呢,封裝可以使得**模組化,繼承可以擴充套件已存在的**,他們的目的都是為了**重用。而多型的目的則是為了介面重用。也就是說,不論傳遞過來的究竟是那個類的物件,函式都能夠通過同乙個介面呼叫到適應各自物件的實現方法。

最常見的用法就是宣告基類的指標,利用該指標指向任意乙個子類物件,呼叫相應的虛函式,可以根據指向的子類的不同而實現不同的方法。

下面就來看一下**實現

class base

void show()

void show(int flag)

protected:

int ma;

};class derive : public base

void show()

private:

int mb;

};int main()

執行結果為

然後在基類中show函式前面加了virtual關鍵字,即

**virtual**  void show(int flag)

現在的執行結果為

可以發現基類和派生類中都多了四個位元組,對基類指標解引用變成了派生類物件,這是為什麼???

有了虛函式,記憶體中會多乙個虛函式指標,虛函式指標指向虛函式表

如果某個函式在基類中是虛函式,派生類中同名且形參型別相同的函式也是虛函式

虛函式指標優先順序最高,在記憶體布局中放在第乙個

虛函式表的組成

1)rtti(執行時的型別資訊)

如果物件中有rtti資訊,直接從中提取資訊,如果沒有則推演

2)虛函式指標(vfptr)相對於整個記憶體布局的偏移

3)虛函式的位址

編譯期間確定虛函式表,派生類虛表與基類虛表合併(向基類合併)-------派生類虛函式表

虛函式表存放在.rodata段,乙個類一張虛表

在執行期間,虛函式指標指向虛函式表

能做虛函式的要點

(1)能取位址

(2)依賴物件調動

滿足這兩點的有 類成員函式 析構函式

不滿足的。比如 普通函式、static修飾的成員函式 、建構函式、內聯函式

虛表的寫入時間

建構函式的第一行**執行之前

繼承與多型

繼承 繼承是c 語言支援 重用及多型的重要機制。通過繼承,可以繼承可以在現有類的基礎上派生出新類,新類將共享現有類的成員,並且還可以新增新的成員。c 語言中,重用主要表現為可以使用現成的類 如.net框架類庫中的類 來定義新類,主要方法有組合和繼承兩種 繼承是物件導向程式設計支援 重用的另乙個重要機...

繼承與多型

虛函式只要在基類裡定義,所以繼承類都不用重新定義為虛函式,自動成為虛函式。虛函式必須有實現,普通成員函式在沒有呼叫時可以沒有實現 定義 class animal 只需要在基類定義函式為虛,子類中不需要新增virtual.smile函式在沒有呼叫時可以不實現。當有函式為虛函式時,析構函式應定義為vir...

繼承與多型

繼承需要符合的關係 is a,父類更通用 子類更具體 子類繼承父類的所有屬性和方法 不包括父類構造方法 super可以呼叫父類的方法和構造方法 子類可以重寫父類的方法 使用多型之後,當需要增加新的子類型別時,無需更改總部類,程式的可擴充套件性及可維護性增強 簡單來說,多型是具有表現多種形態的能力的特...