为什么切片恰好发生?

时间:2014-06-27 21:04:07

标签: c++ inheritance polymorphism virtual object-slicing

当我们将超类分配给子类时,我理解切掉对象的其他子类特定部分,如下所示:

Sub mySub;
Super mySuper = &mySub;
// mySuper DOESN'T contain any sub class behaviour

如果我们这样做了:

Sub mySub;
Super& mySuper = &mySub;
// mySuper DOES contain the sub class behaviour

但我不明白为什么参考有效以及对象为什么没有。

我已经看到原因是因为没有引用需要复制对象 - 但我仍然不知道为什么会导致切片?

我也不明白参考的原因。我们指向Sub对象开头的Super引用,但是编译器知道超级对象应该有多大,所以我不希望将内存与Super部分相关联(对应于子类的子类组件)对象)到超级参考?

1 个答案:

答案 0 :(得分:4)

Super mySuper = mySub;

在这种情况下,实例化一个新对象并调用复制构造函数。新对象不包含任何额外内容是合理的。

Super& mySuper = mySub;

在这种情况下,您可以设置对象的引用。引用就像一个指针,它不知道对象有多大。它只引用了哪种对象以及它在内存中的位置。基于从mySuper的地址派生的“Sub”类可能与mySub的地址不同。您可以通过使用指针并打印其值来轻松尝试。 虽然引用本身只知道对象的“超级”部分的位置,但您可以退回;编译器知道在哪里找到“Sub”对象的其余部分,如果它真的是一个。