2012-03-11 84 views
0

說我有指針數組到一個抽象類:這會導致對象切片嗎?

Piece *pieces[2]; // where piece is an abstract class 

我具有延伸Piece稱爲KingQueen兩個類。我分配一個KingpiecesQueen一個點到另一個點:

pieces[0] = new King(); 
pieces[1] = new Queen(); 

如果我沒有重載賦值運算符,並切片發生的呢?抑或pieces[0]Kingpieces[1]一個實例是Queen一個實例?該數組中發生了什麼(如果這是C++)?

編輯:見問題here代碼的一個完整的例子。會發生

+2

我可以假裝沒有編譯器錯誤,但這並不意味着我可以假裝我知道結果代碼的作用。請修復您的代碼以成爲真正的C++。 – 2012-03-11 00:18:00

+0

@BenjaminLindley好的,我將它改爲我認爲最好的例子是我的問題。我不想通過我的代碼來描述錯誤的問題,所以最初這就是爲什麼我試圖讓代碼只是描繪想法而不用擔心語法。 – 2012-03-11 00:20:58

+0

你之前有過一半。你解決了一件事(刪除了解除引用('*')),但又破壞了另一件事(用'&'替換'new')。您的代碼現在可以編譯,但是您所做的是未定義的行爲(即使它看起來可行)。您正在創建一個臨時對象,然後存儲它的地址。不要這樣做。 – 2012-03-11 00:55:06

回答

4

這實際上並不編譯:不能分配King *Piece(的表達*pieces[0]的類型)(該表達new King的類型)。

要回答你的問題暗示,雖然:

Piece *piece = new King(); // fine, no slicing, just assigning a pointer 
*piece = Queen();   // oops, slicing - assigning a Queen to a Piece 

在你的問題的陣列,假設你寫pieces[0] = new King;等等,你只可以存儲兩個Piece指針,它指向一個到King,其中一個指向Queen。會發生

+0

謝謝你,這是我正在尋找。抱歉代碼沒有編譯;我是一名學生,我只是想知道這個概念,但我仍然試圖完全理解指針數組。當我到家後,我可以測試和編譯代碼,以便將來看到這個問題的其他人不會混淆。 – 2012-03-11 00:36:04

+2

@AustinMoore:如果你有互聯網連接,你可以隨時測試你的代碼(只要你堅持標準庫):http://ideone.com/ – 2012-03-11 00:38:53

+0

@BenjaminLindley:謝謝你的鏈接:)我用http://www.comeaucomputing.com/tryitout在網上編譯的東西,但它不鏈接或運行... – 2012-03-11 00:43:48

1

沒有切片。你在做指針分配,而不是對象分配。

0

是切片。

切片總是會發生,每當你正試圖把派生類對象的任何基類的。如果您的派生類添加了您的基類不提供的某些功能,則此切片將變得可見。

請記住,這是當你沒有關注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)