当我们将超类分配给子类时,我理解切掉对象的其他子类特定部分,如下所示:
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部分相关联(对应于子类的子类组件)对象)到超级参考?
答案 0 :(得分:4)
Super mySuper = mySub;
在这种情况下,实例化一个新对象并调用复制构造函数。新对象不包含任何额外内容是合理的。
Super& mySuper = mySub;
在这种情况下,您可以设置对象的引用。引用就像一个指针,它不知道对象有多大。它只引用了哪种对象以及它在内存中的位置。基于从mySuper
的地址派生的“Sub”类可能与mySub
的地址不同。您可以通过使用指针并打印其值来轻松尝试。
虽然引用本身只知道对象的“超级”部分的位置,但您可以退回;编译器知道在哪里找到“Sub”对象的其余部分,如果它真的是一个。