多型的實現原理分析:
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不是虛函式,編譯...