假设我有一个指向抽象类的指针数组:

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

我有两个扩展类 Piece 被称为 KingQueen. 。我分配一个 King 到某个地点 piecesQueen 到另一个地方:

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

如果我没有重载赋值运算符,是否会发生切片?或者确实 pieces[0] 是一个实例 Kingpieces[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;, 等等,你只需存储两个 Piece 指针,其中一个指向 King 其中之一指向 Queen.

其他提示

不会发生切片。您正在执行指针分配,而不是对象分配。

是的,会发生切片。

每当您尝试将派生类对象放入其任何基类时,切片总是会发生。如果您的派生类添加了一些您的基类未提供的功能,则此切片将变得可见。

请记住,当您不遵循 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