昨天面試,面試官讓我說一說求乙個類的sizeof應該考慮的問題,心想,太好了,之前sizeof可是做了不少功夫,就說了
類的非靜態、非全域性成員
,如果有
虛函式就要加上乙個
指向虛表的指標
,4位元組大小,然後說,大概是這樣。面試官就問,虛函式的實現機制是?大
概講了一下虛表之類的東東
,然後他問,那如果是虛繼承呢,求sizeof還是一樣的麼?先是一愣,心
想,媽呀,什麼是虛繼承呢,然
後還是淡定地回了,應該也是一樣的吧,都是用乙個指標來指向續表,面試官便沒怎麼說。
面試完都沒怎麼再去想sizeof的問題了,一直覺得沒什麼問題,不過今天一大早,回想一下,覺得不妥,上網搜了一番,發現,原來沒有想象的簡單,越看也越糊塗,索性自己在vc上寫幾個類試試,結果,果然是不一樣的,昨天的面試果然是悲催了啊t_t
還是先總結一下剛剛領會到的:
一、個空類
class a ;
求sizeof的結果是1,因為即使是沒有成員之類的,乙個類存在,至少都要給他乙個空間,不然就沒有存在的意義了。
二、簡單的類
class a
這個也好求,就是sizeof(a.a)+4(指向虛表的指標)
三、子類普通繼承、父類中不含虛函式
class a
class b:public a
sizeof(b)=sizeof(a)+sizeof(b.b)+4(指向虛表指標)
四、子類普通繼承、父類含虛函式
class a
class b:public a
sizeof(b)=sizeof(a)-4(sizeof(a)中有乙個指向虛表的指標)+sizeof(b.b)+4(指向虛表指標)
因為普通繼承,子類和父類的虛函式存放在同乙個虛表中,所以,只需要存乙個指向續表的指標即可;
五、子類虛繼承、父類不含虛函式
class a
class b:virtual public a
sizeof(b)=sizeof(a)+4(指示父類存放空間的起始偏移量)+sizeof(b.b)+4(指向b的虛表的指標)
六、子類虛繼承、父類含虛函式
class a
class b:virtual public a
sizeof(b)=sizeof(a)+4(指示父類存放空間的起始偏移量)+sizeof(b.b)+4(指向b的虛表的指標)
虛繼承時,父類和子類的虛函式表分開放,所以,分別儲存兩個指向對應續表的指標,因而不用減去sizeof(a)中續表指標的大小。
求乙個類的sizeof應考慮的問題
昨天面試,面試官 讓我說一說求乙個類的sizeof應該考慮的問題,心想,太好了,之前sizeof可是做了不少功夫,就說了類的非靜 態 非全域性成員,如果有虛函式就要加上乙個指向虛表的指標,4位元組大小,然後說,大概是這樣。面試官就問,虛函 數的實現機制 是?大概講了一下虛表之類的東東,然後他問,那如...
對乙個類求sizeof
include using namespace std class base int main int main int main private int a 佔4位元組 char p 4位元組指標 class derive public base derive private static int...
空類的sizeof,有乙個虛函式的類的sizeof
題目 二 執行下面的 輸出是什麼?class a class b b class c virtual c int tmain int argc,tchar argv 答案是1,1,4 class a 是乙個空型別,它的例項不包含任何資訊,本來求 sizeof 應該是0 但當我們宣告該型別的例項的時候...