質問

抽象クラスへのポインタの配列を持っているとした:

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

PieceKingというQueenを拡張する2つのクラスがあります。Kingpiecesおよび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)
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top