虛繼承的內存佈局手札1——基於VS2012

1、紙上得來總覺淺,低頭debug才深刻。

對於《深度探索C++對象模型》這類型的書,得到的知識要去及時鞏固才能實現永久記憶。


2、在實現了了虛擬繼承歸併分支之後的內容佈局跟虛表的可複用存在極大關係。

繼承的順序決定了A和B的佈局順序,然後Common則在高地址,即公虛基類的佈局放在D的尾部。


情況1:

class A:public virtual Common{...};

class B:public virtual Common{...;virtual void NotInCommon(){}};

class D:public A,public B{...}

內存佈局則是:

D{A,B,Common}; A和Common共用一張虛表


情況1:

class A:public virtual Common{...};

class B:public virtual Common{...;virtual void NotInCommon(){}};

class D:public B,public A{...}

內存佈局則是:

D{B,A,Common};從低地址忘高地址(對應從上到下的視圖)。


繼承列表在某種程度上相當於變量聲明,聲明的是該位置存放的是某個基類。D、A、Common公用一張虛表。優先調整爲能滿足單繼承的狀態(待續。),而B則通過偏移。如果在VS中是看不到當前類的虛表指針——這不科學,怎麼可能找不到,其實虛表指針就是和最後的一個父類對象使用公用一個虛表指針變量。但是由於視圖是基類對象,也就說看不到此派生對象多增加的虛函數。待續。


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