質問
抽象クラスへのポインタの配列を持っているとした:
Piece *pieces[2]; // where piece is an abstract class
.
とPiece
とKing
というQueen
を拡張する2つのクラスがあります。King
をpieces
およびQueen
に別のスポットにスポットに割り当てます。
pieces[0] = new King();
pieces[1] = new Queen();
.
代入演算子を過負荷でなければ、スライスが発生しますか?またはpieces[0]
はKing
のインスタンスで、pieces[1]
はQueen
のインスタンスです。そのアレイで何が起こっているのか(これがC ++の場合)?
編集:問題のコードの詳細を参照してください。ここ
解決
実際にはコンパイルされません.King *
(式new King
の型)をPiece
(式*pieces[0]
の型)に割り当てることはできません。
あなたの暗黙の質問に答えるために、:
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;
などを書いたと仮定して、2つのPiece
ポインタを保存していると仮定して、そのうちの1つがKing
を指しています。
他のヒント
スライスは発生しません。オブジェクト割り当てではなく、ポインタの割り当てをしています。
はいスライスが発生します。
スライスは、派生クラスオブジェクトをその基本クラスに任意に入力しようとしているときはいつでも常に発生します。このスライスは、派生クラスがあなたの基本クラスが提供していない機能をいくつか追加した場合に表示されます。
覚えておいて、これはあなたが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)
.