比如一個類:
class T
{
public:
void Func();
virtual void Func2();
private:
int a;
int b;
};
sizeof(T)的大小,如果沒有虛函數,那麼隻有資料成員存儲在資料段,那麼其大小就相當于struct T{int a; int b;};的大小。如果沒有任何資料成員,sizeof會傳回1.
當加入虛函數之後,類需要存儲一個虛表指針,指向一個虛函數表。那麼sizeof的大小需要再加上一個指針的大小。每個函數值有一個虛表,新的虛函數會添加到虛表中。虛表會被子類所繼承,擁有自己的虛函數表。這裡的繼承是指,父類定義了一個虛函數,那麼子類即使不定義虛函數,給出父類的虛函數的實作,他也會擁有一個虛函數表,裡面包含有父類的虛函數。
注意如果在類中或者結構體中加入一個static成員,sizeof不計算其大小的。類的static成員,即使在子類中也是共享父類的。即如果父類中有一個staic成員,那麼子類與父類都隻有這一個實體。