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