一.虛函數表介紹
Virtual Table虛函數表是實現多態的
每個有虛函數的類的實現,都有個指向虛函數的指針表(不管是父類還是子類)
指向虛表的指針是作為數據成員存在實例對象中
當調用虛函數時,就去查找對象的虛表中指向整頓派生類函數
虛函數表就是虛函數指針組成的一個數組
對于類的普通函數使用的是靜態綁定,發生在編譯期
對類的虛函數是動態綁定,發生在運行期
虛函數表的創建是在編譯期完成
虛函數按照其聲明的順序放置在虛表中
虛表中 如果子類額外加了虛函數,父類的虛函數在子類的虛函數前面
虛表中,子類會覆蓋父類的虛函數,子類沒有覆蓋的虛函數就沿用父類的
多重繼承時,每個父類都有自己的虛函數表,子類的虛函數地址按照聲明順序放在第一個積累的虛表最后;
二.單向繼承虛表模式
三.多重繼承虛表模式
四.多重繼承并有重寫的
五.注意:
1.父類指針是不能調用子類中未覆蓋父類的,而是自己新加的成員函數的行為都會被編譯器視為非法;
2.如果父類的虛函數是private或是protected的,但這些非public的虛函數同樣會存在于虛函數表中,所以事實上可以使用訪問虛函數表的方式來訪問這些non-public的虛函數,但這樣又是不合理的。