请考虑以下代码:
Base b;
if (something)
b = DerivedA();
else
b = DerivedB();
众所周知,在这种情况下,会发生“切片”:在 C++ 中,我们不能将基类型的变量分配给派生类型的对象;该对象将被“切割”掉任何未在基本类型中定义的东西。(如果我们想做这样的事情,我们必须使用指针或引用)。
我想了解这件事的真正原因。即,Base
变量不能在Derived
不切片的情况下保存对象的原因。
我的假设是,这样做的原因是Base
对象和Derived
对象的大小可能不同,因此我们不能保证能够将整个Derived
对象存储在Base
变量中。ABase
可能占用 4 个字节,而 aDerived
是 7 个字节。所以我们决定总是对派生对象进行切片以适应基本类型的大小。
我们可以使用指针来做到这一点,因为它们都占用相同数量的内存。
这个假设正确吗?如果不是,那么切片的实际原因是什么?