【发布时间】:2014-10-16 21:58:36
【问题描述】:
请考虑以下代码:
Base b;
if (something)
b = DerivedA();
else
b = DerivedB();
众所周知,在这种情况下,会发生“切片”:在 C++ 中,我们不能将基类型的变量分配给派生类型的对象;该对象将被“切割”掉任何未在基本类型中定义的东西。 (如果我们想做这样的事情,我们必须使用指针或引用)。
我想了解造成这种情况的实际原因。即,Base 变量在不切片的情况下无法容纳 Derived 对象的原因。
我的假设是,原因是 Base 对象和 Derived 对象的大小可能不同,因此我们不能保证能够存储整个 Derived 对象在Base 变量中。 Base 可能占用 4 个字节,而 Derived 占用 7 个字节。所以我们决定总是对派生对象进行切片以适应基本类型的大小。
我们能够使用指针来做到这一点,因为它们都占用相同数量的内存。
这个假设正确吗?如果不是,那么切片的真正原因是什么?
【问题讨论】:
-
您自己回答问题。 7个字节不能进4个。
-
@MattMcNabb 好的,这是我的假设,想确认一下。想也许这更像是一个设计问题。顺便说一句,为什么我们不能调整变量的大小以适应分配的对象?
-
这正是切片的作用。它只是没有按照你想要的方向调整大小。
-
"我们可以用指针来做到这一点,因为它们都占用相同数量的内存。" - 这没有任何意义。指针不一定占用相同数量的内存,但这没有实际意义,因为指针不是类类型,因此无论如何它们都不能被切片。
-
@MattMcNabb。这是完全有道理的,而且是真的:
sizeof(Base *) == sizeof(DerivedA *).
标签: c++ variables object memory object-slicing