c 普通繼承 虛繼承 虛函式對sizeof的影響

2021-08-09 04:41:17 字數 2356 閱讀 4197

【摘要】

本文從5段**例項出發,通過類中類的普通繼承,類的虛繼承,類的多重繼承,多個虛函式類的普通繼承、虛繼承與多重繼承,幾個交叉概念,詳細的闡釋了繼承、虛函式與虛繼承的基本概念,深入剖析了繼承於虛繼承的區別於聯絡。

【exp.001-虛繼承】

#include class a ;//sizeof(a)=4

class b : virtual public a ;//sizeof(b)=4(a副本)+4(虛表指標)+4(自己變數)=12

class c : virtual public b ;//sizeof(c)= 12(b副本)+4(虛表指標) = 16,如果這裡改為直接繼承,那麼sizeof(c)=12

int main()

解析:這裡需要理解虛繼承基類對派生類的空間大小的影響,理解虛指標在虛繼承中為子類帶來了哪些空間的改變。

【exp.002-多重繼承】

#include class a ;//sizeof(a) = 4

class b : virtual public a ;// sizeof(b) =4+4=8

class c : virtual public a ;//sizeof(c) =4+4=8

class d : public b, public c;

class e : virtual public b, virtual public c;

//sizeof(d)=8+8-4=12 這裡需要注意要減去4,因為b和c同時繼承a,只需要儲存乙個a的副本就好了,sizeof(d)=4(a的副本)+4(b的虛表)+4(c的虛表)=12

int main()

解析:這裡需要關注 class d 的資料空間大小,理解多重虛繼承對派生類虛指標以及派生類空間的影響。

【exp.003-普通繼承(含有:空類、虛函式)】

#include using namespace std;

class a

; class b

}; class c

virtual void func1()

};//class d: public a, public c

// // virtual void func1()

//};

class d: public a, public c

virtual void ss1() //普通繼承時,即使d是重新定義的虛函式,也不增加虛指標的大小

};

class e: public b, public c

virtual void func1()

};class f:public d,public e

;//只有b,c的各增加乙個虛指標大小,後面派生類e,或者派生的派生類f都不再增加虛指標空間

int main(void)

;// size = 4

class base1: virtual public commonbase

virtual void print2()

private:

int b1;

};//4副本+4虛指標+4自身+4(虛繼承+虛函式構成指標多乙個)=16

class base2: virtual public commonbase

virtual void dump2()

private:

int b2;

};//同理16

class derived: public base1, public base2

void dump2()

private:

int d;

};//16+16-4+4=32

解析:如果不是虛繼承的類,即便有虛函式也不會因此增加儲存空間,如果是虛繼承的類,沒有虛函式就新增乙個虛指標空間,有虛函式不論多少個,就新增兩個虛指標空間。

【exp.005-虛繼承與虛函式】

#include using namespace std;

class a

virtual void aa2()

private:

char ch[6];

}; // 1*6+4 = 補齊 = 12

class b: virtual public a

virtual void bb2()

}; // 12(副本)+4(虛繼承)+4(虛指標) = 20

int main(void)

{ cout<<"a's size is "<

**:

虛函式的三種繼承(普通繼承,虛函式繼承,虛繼承)

include using namespace std class a class b public a class c public virtual b int main cout b類,普通繼承,乙個整型4b,繼承下來的乙個整型4b,虛指標4b,共12b b類的虛函式表有aa與bb兩個虛函式位址...

虛函式 虛繼承 C

關於虛表,我們就要用到乙個關鍵字 virtual,可以修飾函式,也可以修飾類。類的成員函式被virtual修飾之後,就成為了虛函式 修飾類,主要是虛繼承。在此之前,我們首先要了解乙個概念 物件模型,也就是說,乙個基類形成之後,裡面的成員是怎麼存放的,當派生類繼承基類之後,派生類的成員是怎麼存放的。我...

虛繼承和虛函式繼承

虛繼承主要用於菱形 形式的繼承形式 虛繼承是為了在多繼承的時候避免引發歧義,比如類 有個就是a,繼承了 c也繼承了 當 多繼承 時,就會有歧義產生了,所以要使用虛擬繼承避免重複拷貝。虛函式繼承是解決多型性的,當用基類指標指向派生類物件的時候,基類指標呼叫虛函式的時候會自動呼叫派生類的虛函式,這就是多...