前言
虛函式執行速度要稍慢一些。為了實現多型性,每乙個派生類中均要儲存相應虛函式的入口位址表,函式的呼叫機制也是間接實現。所以多型性總是要付出一定代價,但通用性是乙個更高的目標。
實驗環境
windows10 企業版
visual studio2017 15.8.1
引入虛函式後記憶體大小變
化
沒有虛函式時類占用記憶體大小
占用記憶體為4位元組。在x86 模式下,整形變數大小為4位元組
有虛函式時類占用記憶體大小
占用記憶體為8位元組。在x86 模式下,整形變數大小為4位元組。剩下4位元組是虛函式表指標,指標變數在x86下佔記憶體大小4位元組。
**中只定義了乙個虛函式,定義多個虛函式,類的大小還是8。虛函式表的指標指向的是虛函式表的入口位址
虛函式表
1 #include2view codeusing
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
虛函式表前後變化
虛函式表在構造父類的時候會記錄所有父類的虛函式
這裡面少顯示了子類的list虛方法,少顯示是編譯器的問題。但是你不能通過父類指標訪問子類list()方法,因為list超出了父類範圍。
子類構造完成後,子類重寫了父類的虛函式,虛函式表中的虛函。數就變成了子類的。狸貓混太子,偷梁換柱的意思
C 多型的實現原理分析
在物件導向開發中,多型是乙個很重要的特性。什麼是多型呢?就是程式執行時,父類指標可以根據具體指向的子類物件,來執行不同的函式,表現為多型。看完上面的實現原理,你可能會覺得有點懵,接下來我們就一點點分析和驗證上面的結論。include using namespace std class parent ...
C 基礎 多型的實現原理分析
多型的實現原理分析 virtual fun ptr 虛函式表指標 乙個類裡面不管有幾個虛函式,只有乙個虛函式表,只需將其加入表中即可,而指向這個表的指標只有乙個,即虛函式表指標 根據賦值相容規則,父類通過指標和引用子類物件後,只能訪問父類的方法,那為什麼將父類的函式寫為虛函式,子類重寫後,父類卻可以...
C 多型實現原理
用virtual關鍵字申明的函式叫做虛函式,虛函式肯定是類的成員函式。存在虛函式的類都有乙個一維的虛函式表叫做虛表。類的物件有乙個指向虛表開始的虛指標。虛表是和類對應的,虛表指標是和物件對應的。多型性是乙個介面多種實現,是物件導向的核心。分為類的多型性和函式的多型性。多型用虛函式來實現,結合動態繫結...