1. 程式人生 > >深入分析深拷貝(Memberwise Copy)和淺拷貝(Bitwise Copy)

深入分析深拷貝(Memberwise Copy)和淺拷貝(Bitwise Copy)

虛擬機制與拷貝方式
     當類中沒有虛擬機制、沒有其他類物件的成員時(只包含built-in型別、指標或者陣列),預設copy ctor進行的是bitwise copy,這會導致物件切片的發生。然而,當類中有虛擬機制,或者有其他類物件成員時,預設copy ctor採用的是memberwise copy,並且會對虛擬機制進行正確的拷貝。

     因為包含虛擬機制的類在定義一個物件時,編譯器會向ctor中新增初始化vtable和vbaseclasstable(依賴於具體編譯器)的程式碼,這樣可以保證vtable中的內容與型別完全匹配。也就是說MyBase和DerivedMyBase有這相似的VTABLE,但不是完全相同——例如DerivedMyBase中還可以定義自己的virtual函式,這樣它的VTABLE就會有更多表項。


     而多型的實現是通過將函式呼叫解析為VTABLE中的偏移量來實現。pMB->Get()可能會被編譯器解析成:
            (*pMB->__vtable[Offset_of_Get])();

     而當MyBase作為虛基類時,訪問其中的資料成員可能就是:
            pMB->__vBaseClassMyBase->b;

     那麼,當“aMB = aDMB;”,copy ctor會執行memberwise copy,正確的初始化aMB的VTABLE,而不是僅僅將aDMB的VTABLE拷貝過來。如果是bitwise copy,aMB物件中的VTABLE將是aDMB的,aMB.Get()呼叫的將是DervieMyBase定義的Get(),這顯然是不符合語義和邏輯的。