class A {
int x;
};
class B : public A {
int y;
};
B b;
我知道b
被视为B
的完整对象,而B
包含的对象是A
的子对象。
但有人向我指出了这一点,
C ++ Standard 1.8的第3段
(1.8 / 3)对于每个对象x,都有一些称为完整的对象 x的对象,确定如下: - 如果x是一个完整的对象,那么 x是x的完整对象。 - 否则,x的完整对象 是包含x。(/ p>)的(唯一)对象的完整对象
在这一点上,我发现整个地方的所有x
都非常混乱的措辞,你能用我的例子解释一下吗?
答案 0 :(得分:3)
听起来,通过“完整对象”,它们指的是由new运算符返回的对象,或者作为局部变量放置到堆栈中。例如,如果我们从您的代码开始(上图),则b是x的完整对象。我们是怎么做到的?通过在层次结构中向上工作:
(如果b已经成为一个更大的对象的一部分,那么我们将不得不在层次结构中进一步找到完整的对象)
答案 1 :(得分:3)
引用来自C ++ 11标准,1.8。更完整:
2)对象可以包含其他对象,称为子对象。子对象可以是成员子对象(9.2),基类子对象(子句10)或数组元素。不是任何其他对象的子对象的对象称为完整对象。
3)对于每个对象x,有一些对象称为x的完整对象,确定如下:
如果
x
是完整对象,则x是x
的完整对象。否则,x的完整对象是包含
x
的(唯一)对象的完整对象。
换句话说,请考虑一下:
struct A { }; struct B : A { };
A x[10];
B y;
现在x[1]
是一个对象,其完整对象为x
,y::A
是一个完整对象为y
的对象(两个子对象的类型为{{1} }})。
这只是术语......
答案 2 :(得分:1)
b
是b
,x
,y
和A
b
子对象的完整对象。