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

2021-07-15 11:52:34 字數 989 閱讀 5356

多型的實現原理分析:

virtual fun ptr  //虛函式表指標

乙個類裡面不管有幾個虛函式,只有乙個虛函式表,只需將其加入表中即可,而指向這個表的指標只有乙個,即虛函式表指標

根據賦值相容規則,父類通過指標和引用子類物件後,只能訪問父類的方法,

那為什麼將父類的函式寫為虛函式,子類重寫後,父類卻可以訪問子類的該函式呢?

父類的虛函式在子類中重寫後,子類的虛表位址將覆蓋父類的虛表位址,

所以父類是父類的虛函式表呼叫的重寫的

舉例:

#include using namespace std;

class base

~base()

{}public:

virtual void show()

重寫前:

base

vfptr-----> vftable

base::show()

base::print()

重寫後:

base

vfptr------> vftable

d::show()

base::print()

----------------------

d::list()     //子類自己的虛函式,父類不能呼叫

單繼承和多繼承中的虛表:

1.單繼承沒覆蓋,子類的虛函式跟在父類的虛函式表後

2.單繼承有部分覆蓋,子類重寫的虛函式覆蓋父類被重寫的虛函式,子類自己的虛函式跟在父類的虛函式表後

3.多繼承沒覆蓋,子類的虛函式只跟在第一父類的虛函式表後,其他父類的虛函式表按申明順序存放

4.多繼承有部分覆蓋,子類重寫的虛函式覆蓋所有父類被重寫的虛函式位址,子類自己的虛函式跟在第乙個父類的虛函式表之後,其他父類的虛函式表按申明順序存放,多繼承中父類只能調動自己的虛函式表

C 多型實現原理分析

前言 虛函式執行速度要稍慢一些。為了實現多型性,每乙個派生類中均要儲存相應虛函式的入口位址表,函式的呼叫機制也是間接實現。所以多型性總是要付出一定代價,但通用性是乙個更高的目標。實驗環境 windows10 企業版 visual studio2017 15.8.1 引入虛函式後記憶體大小變 化 沒有...

C 多型的實現原理分析

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

c 基礎 多型的實現原理

當類中宣告虛函式時,編譯器會在類中生成乙個虛函式表。虛函式表用來儲存虛函式指標的資料結構,由編譯器自動生成和維護。當存在虛函式時,每個物件都有乙個指向虛函式表的指標 vptr 編譯器不需要區分子類物件或者父類物件,只需要根據vptr指標來確定呼叫的函式。編譯器確定是否為虛函式 fun不是虛函式,編譯...