資源描述:
《(多重繼承虛繼承的內(nèi)存布局).doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、1.多重繼承、虛繼承的內(nèi)存空間布局對(duì)多重繼承、虛繼承的內(nèi)存空間布局進(jìn)行研究,循序漸進(jìn)的進(jìn)行處理,主要關(guān)注以下幾點(diǎn):1)偏移表2)虛表3)數(shù)據(jù)成員4)它們的位置5)它們的大小及內(nèi)容6)它們間的關(guān)系。1.1單繼承,無(wú)虛函數(shù)的情況單繼承、無(wú)虛函數(shù)的情況是:1)基類的數(shù)據(jù)成員2)派生類新增的數(shù)據(jù)成員派生類的大小是基類數(shù)據(jù)成員和派生類新增數(shù)據(jù)成員大小之和。順序是按照上面的基類、派生類的順序進(jìn)行布局。1.2單繼承,有虛函數(shù)的情況單繼承、有虛函數(shù)的情況:1)派生類的虛表指針2)基類的數(shù)據(jù)成員3)派生類新增的數(shù)據(jù)成員其中,派生類的虛表,是在基類的虛表基礎(chǔ)之
2、上所作的修改,有可能是:1)對(duì)基類中虛函數(shù)地址的覆蓋2)派生類中新增的虛函數(shù)地址1)只要有虛函數(shù),就有虛表產(chǎn)生。2)虛表中條目的個(gè)數(shù),是本類中虛函數(shù)的個(gè)數(shù)3)虛表中各條目的順序,與類中聲明(定義)的虛函數(shù)順序一致1.3多重繼承,無(wú)虛函數(shù)的情況多重繼承、無(wú)虛函數(shù)的情況是:1)基類的數(shù)據(jù)成員2)基類的數(shù)據(jù)成員3)派生類新增的數(shù)據(jù)成員這里與1.1單繼承,無(wú)虛函數(shù)的情況的差別是——可能存在多個(gè)基類。這里基類數(shù)據(jù)成員的排放,是按照繼承的數(shù)據(jù)依次進(jìn)行的。1.4多重繼承,有虛函數(shù)的情況多重繼承,有虛函數(shù)的情況是:1)基類的虛表指針2)基類的數(shù)據(jù)成員3)基
3、類的虛表指針4)基類的數(shù)據(jù)成員5)派生類新增的數(shù)據(jù)成員這里與1.2單繼承,有虛函數(shù)的情況的差別是——虛表這里說(shuō)基類的虛表指針,其實(shí)是不太恰當(dāng)?shù)?,因?yàn)樗鼈儗?shí)際上是派生類虛表的一部分。也就說(shuō),派生類的虛表是由多個(gè)基類的虛表所構(gòu)成的。不存在一個(gè)單一的派生類的虛表。派生類的虛表?xiàng)l目是在各基類的虛表基礎(chǔ)之上修改所得,可能包括:1)對(duì)基類中虛函數(shù)的覆蓋,會(huì)更新各基類虛表中的條目2)派生類中新增的虛函數(shù)地址,會(huì)追加到第一個(gè)繼承的基類的虛表中至此,上面1.1單繼承,無(wú)虛函數(shù)的情況1.2單繼承,有虛函數(shù)的情況1.3多重繼承,無(wú)虛函數(shù)的情況1.4多重繼承,有虛
4、函數(shù)的情況是從單繼承/多重繼承,無(wú)/有虛函數(shù)的角度進(jìn)行的梳理。下面將以菱形繼承為主線,來(lái)進(jìn)行梳理。(菱形繼承中可能出現(xiàn)二義性,會(huì)逐步的引入虛繼承,虛基類的概念)菱形繼承(diamond-inheritance)1.5菱形繼承,無(wú)虛函數(shù)的情況ClassA{};ClassB:publicA{};ClassC:publicA{};ClassD:publicB,publicC{};菱形繼承,無(wú)虛函數(shù)的情況是:1)基類B的數(shù)據(jù)成員a)基類A的數(shù)據(jù)成員b)派生類B新增的數(shù)據(jù)成員2)基類C的數(shù)據(jù)成員a)基類A的數(shù)據(jù)成員b)派生類C新增的數(shù)據(jù)成員3)派生類
5、D新增的數(shù)據(jù)成員這里仍然是沒(méi)有太大的變化,按照基類、派生類的順序安放數(shù)據(jù)成員。1.6菱形繼承,有虛函數(shù)的情況ClassA{};ClassB:publicA{};ClassC:publicA{};ClassD:publicB,publicC{};菱形繼承,有虛函數(shù)的情況:1)基類B的虛表指針a)基類A的虛函數(shù)(未被覆蓋的部分)b)基類B的虛函數(shù)(覆蓋A的部分,新增的部分)c)派生類D的虛函數(shù)(新增的部分)2)基類B的數(shù)據(jù)成員a)基類A的數(shù)據(jù)成員b)派生類B新增的數(shù)據(jù)成員3)基類C的虛表指針a)基類A的函數(shù)(未被覆蓋的部分)b)基類C的虛函數(shù)(
6、覆蓋A的部分,新增的部分4)基類C的數(shù)據(jù)成員a)基類A的數(shù)據(jù)成員b)派生類C新增的數(shù)據(jù)成員5)派生類D新增的數(shù)據(jù)成員仍然要說(shuō)一點(diǎn),這里說(shuō)基類的虛表指針,其實(shí)是不太合適的,它們是派生類的虛表的一部分,是派生類在基類的虛表基礎(chǔ)之上所做修改而來(lái)的:1)如果派生類中的虛函數(shù)與基類中的形成覆蓋,則派生類會(huì)對(duì)基類的虛表中相應(yīng)條目做覆蓋處理2)派生類中新增的虛函數(shù)地址,追加至第一個(gè)繼承的基類虛表中。1.7菱形繼承,無(wú)虛函數(shù),為虛繼承的情況在上面的1.5菱形繼承,無(wú)虛函數(shù)的情況1.6菱形繼承,有虛函數(shù)的情況中,最基類A,在內(nèi)存空間中有多份拷貝。利用虛繼承可
7、以解決,此時(shí)最基類A成為虛基類。所以,菱形繼承,無(wú)虛函數(shù),為虛繼承的情況,也就是菱形繼承,無(wú)虛函數(shù),有虛基類的情況。虛繼承的引入,使得虛基類在內(nèi)存中僅存一份拷貝,同時(shí)帶來(lái)的影響還有內(nèi)存空間布局的變化。大概有:1)虛基類的數(shù)據(jù)成員在內(nèi)存中的位置2)偏移表偏移表的存在,是因?yàn)椤摶惖膯畏荽嬖冢摶怉又被B,C所共享,所以對(duì)B,C而言,它們就各自需要確定A的所在位置。偏移表就是用于該問(wèn)題。偏移表的數(shù)目,就是直接繼承自虛基類的派生類的數(shù)目?,F(xiàn)在來(lái)一一測(cè)試。在看到這些信息后,我們猜測(cè)其內(nèi)存空間的布局:1)B的偏移表,在ecx處2)B的數(shù)據(jù)成員
8、,在ecx+4處3)C的偏移表,在ecx+8處4)C的數(shù)據(jù)成員,在ecx+0C處5)D的數(shù)據(jù)成員,在ecx+10處2)A的數(shù)據(jù)成員,在ecx+14處下面先對(duì)偏移表進(jìn)行跟蹤正是通過(guò)