为什么会发生切片呢?

Why does slicing occur exactly?

本文关键字:切片 为什么      更新时间:2023-10-16

我理解,当我们将超类赋值给子类时,将对象中额外的子类特定部分切掉,如下所示:

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

但是我不明白为什么引用有效而对象却不行。

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

我也不明白为什么参考文献有效。我们指向一个超级引用到一个子对象的开始,但编译器知道一个超级对象应该有多大,所以我不希望将内存超越超级部分(对应于对象的子类组件)到超级引用?

Super mySuper = mySub;

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

Super& mySuper = mySub;

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