1. 程式人生 > >C++虛繼承(理解還不到位)

C++虛繼承(理解還不到位)

即編譯器無法確定你在d.f()中要呼叫的函式f到底是哪一個。這裡可能會讓人覺得有些奇怪,命名只定義了一個CA::f,既然大家都派生自CA,那自然就是呼叫的CA::f,為什麼還無法確定呢?
這是因為編譯器在進行編譯的時候,需要確定子類的函式定義,如CA::f是確定的,那麼在編譯CB、CC時還需要在編譯器的語法樹中生成CB::f,CC::f等標識,那麼,在編譯CD的時候,由於CB、CC都有一個函式f,此時,編譯器將試圖生成這兩個CD::f標識,顯然這時就要報錯了。(當我們不使用CD::f的時候,以上標識都不會生成,所以,如果去掉d.f()一句,程式將順利通過編譯)
要解決這個問題,有兩個方法:
1、重寫函式f():此時由於我們明確定義了CD::f,編譯器檢查到CD::f()呼叫時就無需再像上面一樣去逐級生成CD::f標識了;
此時CD的元素結構如下:
|CB(CA)|
|CC(CA)|
故此時的sizeof(CD) = 8;(CB、CC各有一個元素k)
2、使用虛繼承:虛繼承又稱作共享繼承,這種共享其實也是編譯期間實現的,當使用虛繼承時,上面的程式將變成下面的形式: