2014-06-27 31 views
1

我明白關閉對象的追加子類特定的部位切排,當我們指定一個超類的子類,如下所示:爲什麼切片恰好發生?

Sub mySub; 
Super mySuper = &mySub; 
// mySuper DOESN'T contain any sub class behaviour 

,如果我們這樣做:

Sub mySub; 
Super& mySuper = &mySub; 
// mySuper DOES contain the sub class behaviour 

但我不明白爲什麼參考的作品,爲什麼對象沒有。

我已經看到了原因是因爲沒有引用的對象需要複製 - 但我仍然不明白爲什麼這應該導致切片?

我也不明白爲什麼參考的作品。我們將一個超級引用指向一個Sub對象的開始,但編譯器知道應該有多大的超級對象,所以我不希望超出超級部分(對應於該對象的子類組件)到超級參考?

+5

_Slicing_是_copying_的副作用。創建參考不會複製對象。 –

+2

'&mySub' ...那裏有錯字嗎?這是一個地址。 –

+0

「我們指向一個Sub對象開始的超級引用」 - 這是不正確的! (即使我用指針替換引用)指針指向包含在「Sub」對象中的「超級」對象的開始。使用多重繼承時,這是一個巨大的差異:指針的值將取決於您將對象轉換爲哪個基類! – Csq

回答

4
Super mySuper = mySub; 

在這種情況下,實例化新對象並調用複製構造函數。新對象不包含任何額外內容是合理的。

Super& mySuper = mySub; 

在這種情況下,您設置對該對象的引用。引用就像一個指針,它不知道對象有多大。只有它引用什麼類型的對象,以及它在內存中的位置。根據mySuper的地址可能與mySub的地址有所不同,得出「Sub」的類別。你可以通過使用指針並打印它們的值來輕鬆地進行嘗試。 儘管引用本身只知道對象的「超級」部分的位置,但您可以回退;編譯器知道在哪裏找到剩餘的「Sub」對象,如果它真的是一個。