C++虛函數列表佈局方式計算技巧

參考:陳皓大佬的C++ 對象的內存佈局(上)

           大佬的C++ 對象的內存佈局(下)

學習多態時產生了如下幾個問題,都在 大佬的文章裏找到了答案

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指針

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章