当我们将父类(super class)分配给子类时,我理解将对象的其他特定于子类的部分切成薄片,如下所示:
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
但我不明白为什么引用有效,而对象却无效。
我已经知道原因是因为没有引用就需要复制对象,但是我仍然不明白为什么这会导致 slice ?
我也不明白为什么引用有效。我们将Super引用指向Sub对象的开头,但是编译器知道super对象应该有多大,因此我不希望将Super部分之外的内存关联起来(对应于该对象的sub class组件) super 引用?
最佳答案
Super mySuper = mySub;
在这种情况下,将实例化一个新对象并调用复制构造函数。合理的是,新对象不包含任何额外内容。
Super& mySuper = mySub;
在这种情况下,您可以设置对对象的引用。引用就像一个指针,它不知道对象有多大。它仅引用哪种对象以及它在内存中的位置。基于哪些类,“Sub”是从
mySuper
的地址派生的,可能不同于mySub
的地址。您可以通过使用指针并打印其值来轻松地进行尝试。尽管引用本身仅知道对象“ super ”部分的位置,但您可以回退;编译器知道在哪里可以找到“Sub”对象的其余部分(如果确实是一个对象)。