C 多型實現原理分析

2022-03-19 06:07:32 字數 2248 閱讀 1030

前言

虛函式執行速度要稍慢一些。為了實現多型性,每乙個派生類中均要儲存相應虛函式的入口位址表,函式的呼叫機制也是間接實現。所以多型性總是要付出一定代價,但通用性是乙個更高的目標。

實驗環境

windows10 企業版

visual studio2017 15.8.1

引入虛函式後記憶體大小變

沒有虛函式時類占用記憶體大小

占用記憶體為4位元組。在x86 模式下,整形變數大小為4位元組

有虛函式時類占用記憶體大小

占用記憶體為8位元組。在x86 模式下,整形變數大小為4位元組。剩下4位元組是虛函式表指標,指標變數在x86下佔記憶體大小4位元組。

**中只定義了乙個虛函式,定義多個虛函式,類的大小還是8。虛函式表的指標指向的是虛函式表的入口位址

虛函式表

1 #include2

using

namespace

std;34

class

base

511 ~base()

1215

public:16

virtual

void

show()

1720

virtual

void

print()

2124

void

fun()

2528

private:29

intx;

30};

3132

class d :public

base

3337 ~d()

38{}

39public:40

void

show()

4144

void

fun()

4548

virtual

void

list()

4952

private:53

inty;

54};

5556

void

main()

57

view code

虛函式表前後變化

虛函式表在構造父類的時候會記錄所有父類的虛函式

這裡面少顯示了子類的list虛方法,少顯示是編譯器的問題。但是你不能通過父類指標訪問子類list()方法,因為list超出了父類範圍。

子類構造完成後,子類重寫了父類的虛函式,虛函式表中的虛函。數就變成了子類的。狸貓混太子,偷梁換柱的意思

C 多型的實現原理分析

在物件導向開發中,多型是乙個很重要的特性。什麼是多型呢?就是程式執行時,父類指標可以根據具體指向的子類物件,來執行不同的函式,表現為多型。看完上面的實現原理,你可能會覺得有點懵,接下來我們就一點點分析和驗證上面的結論。include using namespace std class parent ...

C 基礎 多型的實現原理分析

多型的實現原理分析 virtual fun ptr 虛函式表指標 乙個類裡面不管有幾個虛函式,只有乙個虛函式表,只需將其加入表中即可,而指向這個表的指標只有乙個,即虛函式表指標 根據賦值相容規則,父類通過指標和引用子類物件後,只能訪問父類的方法,那為什麼將父類的函式寫為虛函式,子類重寫後,父類卻可以...

C 多型實現原理

用virtual關鍵字申明的函式叫做虛函式,虛函式肯定是類的成員函式。存在虛函式的類都有乙個一維的虛函式表叫做虛表。類的物件有乙個指向虛表開始的虛指標。虛表是和類對應的,虛表指標是和物件對應的。多型性是乙個介面多種實現,是物件導向的核心。分為類的多型性和函式的多型性。多型用虛函式來實現,結合動態繫結...