先看例程:
#include
#include
#include
#include
using namespace std;
class a
//const int size;
};class a2
};class b:virtual public a
};class c:public a
};class d:public virtual b
};class e:public virtual a,public virtual a2
};//int i=1;
int main()
在vs2010中的輸出結果為:
分析原因:
在vs2010中,在虛繼承時,派生類與基類不共享虛函式表指標,所以派生類會在基類的基礎上增加乙個虛函式表指標和虛基類指標。如果是多層虛繼承,每乙個派生類都會有自己的虛基類指標,虛基類指標是永遠不會共享的。如果不是虛繼承,則派生類和基類共享虛函式表指標,且派生類裡不會有虛基類指標。
在g++中,即使虛繼承,派生類也會和基類共享虛函式指標,有點怪異啊。
另外,靜態成員不會占用物件內的空間。
通過 在專案->屬性->c/c++->命令列中新增/d1reportsingleclasslayoute即可檢視類e的記憶體分布情況:
1> class e size(28):
1> +---
1> 0 |
1> 4 |
1> 8 | q
1> | (size=1)
1> +---
1> +--- (virtual base a)
1> 12 |
1> 16 | a
1> | (size=1)
1> +---
1> +--- (virtual base a2)
1> 20 |
1> 24 | a2
1> | (size=1)
1> +---
可以看到在類e中除了兩個虛繼承得到的基類,還增添了乙個虛函式表指標和虛基類表指標。虛函式表指標並不與基類共享。
虛繼承和虛函式對sizeof的影響
先看例程 include include include include using namespace std class a const int size class a2 class b virtual public a class c public a class d public virt...
c 普通繼承 虛繼承 虛函式對sizeof的影響
摘要 本文從5段 例項出發,通過類中類的普通繼承,類的虛繼承,類的多重繼承,多個虛函式類的普通繼承 虛繼承與多重繼承,幾個交叉概念,詳細的闡釋了繼承 虛函式與虛繼承的基本概念,深入剖析了繼承於虛繼承的區別於聯絡。exp.001 虛繼承 include class a sizeof a 4 class...
虛繼承和虛函式繼承
虛繼承主要用於菱形 形式的繼承形式 虛繼承是為了在多繼承的時候避免引發歧義,比如類 有個就是a,繼承了 c也繼承了 當 多繼承 時,就會有歧義產生了,所以要使用虛擬繼承避免重複拷貝。虛函式繼承是解決多型性的,當用基類指標指向派生類物件的時候,基類指標呼叫虛函式的時候會自動呼叫派生類的虛函式,這就是多...