學習多態時產生了如下幾個問題,都在 陳皓大佬的文章裏找到了答案
1、父類中不是虛函數,子類中是虛函數;多態調用時爲什麼不能調用子類的函數?
2、多層繼承的內存佈局是怎麼樣的?
本文是介紹總結計算技巧;代碼驗證的話就參考上面的兩篇文章;
注:以下模型圖中所有函數都是虛函數
一、單一的一般繼承
計算方法:
1、先Child繼承Parent:將子類(Child)重寫的方法覆蓋父類(Parent),剩下的接到虛函數列表的最後面
2、再由GrandChild繼承上面的內存:同理,將GrandChild中重寫的方法覆蓋上面的內存模型中,剩下的接到虛函數列表的最後面
二、一般的多重繼承
計算方法:
1、每個父類都有自己的虛表,重寫的函數都被覆蓋;
2、 子類剩下的虛函數被放到了第一個父類的表中。
3、 內存佈局中,其父類佈局依次按聲明順序排列。
三、重複繼承(非虛擬繼承)
計算方法:
1、B1,B2按照單一的一般繼承的方法分別繼承B
2、用C中重寫的方法覆蓋,
3、把c中剩下的放在B1中
四、單虛擬繼承(繼承時使用了virtual關鍵字)
1、將父類(B)單獨拎出放在後面,用子類(B1)中重寫的方法覆蓋父類中的方法;
注:如果是虛擬繼承,子類(B1)的VPTR後會接一個 int* 指針,其指向的的值是-4;子類的成員結束後會有一個 NULL指針
五、多重虛擬繼承
計算方法:
1、用四中的方法讓B1,B2同時繼承B
2、用D重寫的函數覆蓋前面的內容
3、把D中虛函數剩下的放入B1中
4、到上一步,虛函數列表已經畫完了,但是D類的內存還沒畫
同單虛擬繼承(繼承時使用了virtual關鍵字)中注:注:如果是虛擬繼承,子類(B1)的VPTR後會接一個 int類型的 -4;子類的成員結束後會有一個 NULL指針