2012-03-11 87 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)