C 菱形繼承中,繼承兩個含虛基類的派生類的類為什麼有兩個指向相同的指標?

時間 2021-05-30 19:00:25

1樓:半仙

為了cast。

物件導向程式設計嘛,經常需要把基類指標轉換為派生類指標,把派生類指標轉換為基類指標。請思考乙個問題:這個轉換是怎麼做到的,編譯器到底幹了什麼才能完成這個轉換?

事實上,如果不打算進行轉換,隨便你記憶體怎麼布局都行,不會影響到別人。但如果要轉換,需要特殊的記憶體布局來確保基類和派生類記憶體布局的一致性。這個記憶體布局下,兩個基類的虛函式表是不能合併的,自然也不能用乙個指標。

不只是虛基類表,虛函式表也是一樣。

大體的框架是這樣,有時間再更新吧。

2樓:Ubp.a

我想是編譯器沒去做這個優化,感覺就像空基類優化一樣吧。後者都要用特殊的語法去指使編譯器去優化掉,那就更不用指望編譯器能對前者這種特殊中的特殊情形去優化了(多個同虛基類的空基類優化)。

3樓:黃亮anthony

我記得這本書上後面有說這個問題,因為A可以轉成基類,這時需要記憶體布局和基類是一樣的,所以A裡面有兩個基類物件,兩個基類物件中分別有乙個基類指標。

而虛繼承的作用正是修改了包含乙個基類這種布局,而是包含乙個基類指標,基類單獨出來,可以共享。

兩個菱形的邊長相等面積相等嗎?為什麼?

喵喵喵qwq 不一定相等。邊長為1的正方形,面積是1 兩個邊長為1的等邊三角形拼成乙個菱形,這個菱形的邊長也是1,面積是sqrt 3 2。因此,結論不成立。 不一定相等 其它回答說的很清楚了 其實很好想,極限思想就好 想象用四根長度相等的木棍組成乙個菱形,我們可以活動它的四條邊,使其變成不同的菱形,...

c 問題 兩個結果為何不同?

旺旺 If the value of the integer literal is too big to fit in any of the types allowed by suffix base combination and the compiler supports extended int...

幫忙解決C 看書遇到的兩個問題?

吳詠煒 書中這種寫法是為了表明這個拷貝構造非常簡單而已。從邏輯的角度,你還是可以理解成編譯器會幫你自動合成平凡的 trivial 拷貝建構函式。從這個角度理解,一是對的,編譯器會幫你自動合成A B的拷貝建構函式。二是錯的,A需要寫拷貝建構函式跟B要不要寫拷貝建構函式完全沒有關係。你就想象B是乙個系統...