虛繼承和虛函式對sizeof的影響

2021-06-25 13:03:26 字數 1140 閱讀 5301

先看例程:

#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也繼承了 當 多繼承 時,就會有歧義產生了,所以要使用虛擬繼承避免重複拷貝。虛函式繼承是解決多型性的,當用基類指標指向派生類物件的時候,基類指標呼叫虛函式的時候會自動呼叫派生類的虛函式,這就是多...