为什么会发生切片呢?
Why does slicing occur exactly?
我理解,当我们将超类赋值给子类时,将对象中额外的子类特定部分切掉,如下所示:
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"对象的其余部分,如果它真的是一个。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 为什么在全局范围内使用"extern int a"似乎不行?
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 为什么会发生堆损坏
- 为什么使用 "this" 指针调用派生成员函数?
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么比较运算符如此快速
- 为什么 Serial.println(<char[]>);返回随机字符?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 为什么不;名字在地图上是按顺序排列的吗
- 我的字符计数代码计算错误.为什么
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 为什么unique_ptr不能阻止自定义删除程序的切片?
- 为什么尽管进行了切片,static_cast仍然使用空指针
- 为什么会发生切片
- 为什么会发生切片呢?