是切片。
切片總是會發生,每當你正試圖把派生類對象的任何基類的。如果您的派生類添加了您的基類不提供的某些功能,則此切片將變得可見。
請記住,這是當你沒有關注OOP校長的情況。校長說,
"When you are deriving from any class you should not change the interface.
The reason for inheritance is moving from generic to specific type, and not
providing new functionality."
而且,如果你遵循這個主要然後切片行爲可以被定義爲,
「Moving from specific behaviour to more general behaviour」.
切片通過指針對象是暫時的,你可以轉換指針回派生類來獲得原來的行爲。通過對象切片是永久的。
NOTE:- Slicing always does not happen in case of private inheritance.
If you try to do so it will result in compilation error.
(For more information on private inheritance:-http://stackoverflow.com/questions/19075517/object-slicing-in-private-inheritance/19083420?noredirect=1#19083420)
我可以假裝沒有編譯器錯誤,但這並不意味着我可以假裝我知道結果代碼的作用。請修復您的代碼以成爲真正的C++。 – 2012-03-11 00:18:00
@BenjaminLindley好的,我將它改爲我認爲最好的例子是我的問題。我不想通過我的代碼來描述錯誤的問題,所以最初這就是爲什麼我試圖讓代碼只是描繪想法而不用擔心語法。 – 2012-03-11 00:20:58
你之前有過一半。你解決了一件事(刪除了解除引用('*')),但又破壞了另一件事(用'&'替換'new')。您的代碼現在可以編譯,但是您所做的是未定義的行爲(即使它看起來可行)。您正在創建一個臨時對象,然後存儲它的地址。不要這樣做。 – 2012-03-11 00:55:06