聊一聊多型,虛函式,虛函式表

2021-10-09 11:54:01 字數 1341 閱讀 1823

我們接觸到的多型被分為靜態多型和動態多型

靜態多型也被稱為編譯時多型,即在程式編譯的時候便繫結了函式

動態多型也被稱為執行時多型,即可以靈活地進行乙個介面,多種方法的呼叫

靜態多型表現為運算子過載和函式過載,動態多型則是主要體現在虛函式的使用,虛函式使父類可以用父類的指標指向子類的物件,呼叫子類的虛函式,這一過程被稱為重寫(override),這一過程是怎麼實現的呢,我們將引入虛函式表

我們在構造物件之後,會給這個類賦予乙個虛函式表,這個虛函式表占用記憶體空間,如何訪問?根據統一賦予的虛函式表的位址,其中存放的是在呼叫虛函式的時候,需要呼叫的函式的位址對應的指標,這個圖非常好,可以完美體現虛函式表和虛指標

從上圖來看 dervied 繼承了 base , 子類實現了的虛函式會覆蓋父類的同名虛函式,另外子類會繼承沒有實現的base的虛函式

這時候,即使使用基類指標指向派生類物件,呼叫的虛函式將會通過派生類物件持有的虛函式表來查詢

1.虛函式與純虛函式的區別

1.其區別在於基類是否實現了 

2.虛函式在基類中可以不重寫,但是純虛函式必須要求子類要實現

3.含有純虛函式的類叫虛基類也叫抽象類,這種基類不能直接生成物件,

因為其中乙個函式是沒有實現的,只能被繼承,執行時動態繫結

2.子類繼承父類

1.如果虛函式在子類中沒有重寫,則繼承父類的虛函式

2.如果在子類中實現了,則出現了重寫過程

3.什麼型別的函式不能是虛函式

1.普通函式 因為普通函式在編譯時已經進行了繫結 所以普通函式只能過載不能重寫

2.靜態成員函式 靜態成員函式只有乙份,由子類和父類共同持有

3.建構函式 建構函式需要知道所有資訊才能建立物件 然而虛函式允許只持有部分資訊 具體來說,

在構造物件的時候 虛函式對應了乙個虛函式表,但是這個物件還沒有被構造 所以虛函式表不存在

4.內聯函式 內聯函式在編譯時被展開,虛函式在執行時才能動態繫結函式 內聯函式不知道它要繫結誰

5.友元函式 因為友元函式不能被繼承 這點和普通函式有點像

4.編譯時如何為虛函式和虛函式表分配記憶體

1.在編譯時會為基類和子類分配乙個一維的記錄位址的陣列,用來記錄需要呼叫的對應虛函式的位址,這個陣列

可以繼承,體現為如果有實現,則把函式的位址對應到新的實現的虛函式的位址

C 多型 虛函式 指標 虛函式表

本文總結了和幾位老師的部落格 一 什麼是多型 關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有 多種形態 這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的 來實現可變的演算法。比如 模板技術,rtti技術,虛函式技術...

c 虛函式和多型 虛函式表

參考 1 c primer plus 第六版 2 中國大學慕課 程式設計與演算法 三 在類的定義中,前面有virtual關鍵字的成員函式就是虛函式 class a 類外函式定義 void a function 說明 1 virtual關鍵字只需要在類定義裡的函式宣告時加上,函式定義時不用加 2 建構...

虛函式表指標,虛函式表

對c 了解的人都應該知道虛函式 virtual function 是通過一張虛函式表 virtual table 來實現的。簡稱為v table。在這個表中,主是要乙個類的虛函式的位址表,這張表解決了繼承 覆蓋的問題,保證其容真實反應實際的函式。這樣,在有虛函式的類的例項中這個表被分配在了 這個例項...