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