C 深入理解 虛繼承 多重繼承和直接繼承

2021-08-08 18:13:01 字數 2321 閱讀 8080



尊重原創:

【摘要】

本文從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;

//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-普通繼承(含有:空類、虛函式)】

class a   

; class b

}; class c

virtual void func1()

};class d: public a, public c

virtual void func1()

};

class e: public b, public c

virtual void func1()

};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-虛繼承與虛函式】

class a

virtual void aa2()

private:

char ch[3];

}; // 1+4 = 補齊 = 8

class b: virtual public a

virtual void bb2()

}; // 8(副本)+4(虛繼承)+4(虛指標) = 16

int main(void)

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

【小結】

重要的事情講三遍!!!

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

c 多重繼承和虛繼承

多重繼承 多重繼承是指從多個直接基類中產生派生類的能力。多重繼承的派生類繼承了所有父類的屬性。struct base1 struct base2 struct d1 public base1,public base2 d1 default 虛繼承 虛繼承的目的是令某個類做出宣告,承諾願意共享它的基類...

C 多重繼承 虛繼承

c 中的多繼承,建構函式處理並沒有問題,物件構造的時候按照繼承中宣告的順序呼叫多個父類的建構函式,析構函式同樣遵守單繼承中的原則。二意性問題 如果多基類中存在同名成員,會產生二意性的問題 比如,root1類中宣告doany 介面,root2類中也宣告了doany 介面,child多承繼root1和r...

c 多重繼承 虛繼承 菱形繼承

多重繼承的特性和使用和單繼承沒區別。按照單繼承來使用即可。多重繼承可能會引入乙個 菱形繼承的問題 這個問題其實並不算問題,因為它合情合理,即多個基類 擁有乙個共同的基類,那麼在構造的時候,由於構造的遞迴特性,就會出現共同基類出現兩份例項的 情況,而且如果針對性修改,那麼如果不在訪問共同基類的時候先指...