我們由上篇博客介紹了繼承的分類,并用文字解釋了他們,今天我們將從它們的底層內(nèi)存分布模板來(lái)進(jìn)一步了解與學(xué)習(xí)。
單繼承:一個(gè)類只有一個(gè)直接父類
單繼承實(shí)例:
class A{public: int _a;};class B:public A{public: int _b;};void funtest(){ B b; b._a = 2; b._b = 1; }int main(){ funtest(); system("pause"); return 0;}我們給派生類中的數(shù)據(jù)成員賦上初值來(lái)方便我們了解派生類對(duì)象的各個(gè)數(shù)據(jù)成員在內(nèi)存中的存儲(chǔ),如圖
多繼承:一個(gè)類有兩個(gè)或兩個(gè)以上直接父類
多繼承實(shí)例:
class A{public: int _a;};class C{public: int _c;};class D{public: int _d;};class B:public A,public C,public D{public: int _b;};void funtest(){ B b; b._a = 1; b._c = 2; b._d = 3; b._b = 4; }int main(){ funtest(); system("pause"); return 0;}我們給派生類中的數(shù)據(jù)成員賦上初值來(lái)方便我們了解派生類對(duì)象的各個(gè)數(shù)據(jù)成員在內(nèi)存中的存儲(chǔ),如圖
菱形繼承:(鉆石繼承)
程序?qū)嵗?/p>
class A{public: int _a;};class C:public A{public: int _c;};class D:public A{public: int _d;};class B:public C,public D{public: int _b;};void funtest(){ B b; b.C::_a = 1; b.D::_a = 2; b._c = 3; b._d = 4; b._b = 5;}int main(){ funtest(); system("pause"); return 0;}我們給派生類中的數(shù)據(jù)成員賦上初值來(lái)方便我們了解派生類對(duì)象的各個(gè)數(shù)據(jù)成員在內(nèi)存中的存儲(chǔ),如圖
由于菱形繼承在訪問(wèn)數(shù)據(jù)成員時(shí)會(huì)產(chǎn)生二義性和數(shù)據(jù)冗余問(wèn)題,于是我們想出了虛繼承的方法。
繼承時(shí)采用關(guān)鍵字virtual來(lái)修飾基類。
虛繼承實(shí)例:
class A{public: int _a;};class B:virtual public A{public: int _b;};void funtest(){ B b; b._a = 1; b._b = 2; }int main(){ funtest(); system("pause"); return 0;}我們給派生類中的數(shù)據(jù)成員賦上初值來(lái)方便我們了解派生類對(duì)象的各個(gè)數(shù)據(jù)成員在內(nèi)存中的存儲(chǔ),如圖
我們已經(jīng)初步開(kāi)始了解了虛繼承,接下來(lái)有三個(gè)問(wèn)題: 問(wèn)題一:虛擬繼承的構(gòu)造函數(shù)做了什么事情?
構(gòu)造函數(shù)由系統(tǒng)自動(dòng)合成,將偏移量表格的地址放入派生類對(duì)象的前4個(gè)字節(jié)。
問(wèn)題二:虛擬繼承與直接繼承有什么區(qū)別?
1.將偏移量表格的地址放入派生類對(duì)象的前4個(gè)字節(jié)
2.虛擬繼承的底層實(shí)現(xiàn)我們可以看到,首先push了一個(gè)1,作為虛擬繼承的標(biāo)志
問(wèn)題三:菱形虛擬繼承(解決菱形繼承的二義性問(wèn)題)
菱形虛擬繼承實(shí)例:
class A{public: int _a;};class C:virtual public A{public: int _c;};class D:virtual public A{public: int _d;};class B:public C,public D{public: int _b;};void funtest(){ B b; b._a = 1; b._c = 3; b._d = 4; b._b = 5;}int main(){ funtest(); system("pause"); return 0;}我們給派生類中的數(shù)據(jù)成員賦上初值來(lái)方便我們了解派生類對(duì)象的各個(gè)數(shù)據(jù)成員在內(nèi)存中的存儲(chǔ)
菱形虛擬繼承的大小,用sizeof求字節(jié)數(shù)
得到D為24個(gè)字節(jié),由上圖的內(nèi)存分布可以很容易的得出結(jié)論
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注