与完整对象和子对象混淆

时间:2011-11-18 01:56:06

标签: c++

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都非常混乱的措辞,你能用我的例子解释一下吗?

3 个答案:

答案 0 :(得分:3)

听起来,通过“完整对象”,它们指的是由new运算符返回的对象,或者作为局部变量放置到堆栈中。例如,如果我们从您的代码开始(上图),则b是x的完整对象。我们是怎么做到的?通过在层次结构中向上工作:

  1. (x)是它自己的完整对象吗?不,它是A的成员,因此 一个更大的对象的一部分。
  2. (A)是它自己的完整对象吗?不,它是B的超类,而且 因此是一个更大的对象的一部分。
  3. (B)是否有自己的完整对象?是的,因为对象b是 声明为B型。
  4. (如果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]是一个对象,其完整对象为xy::A是一个完整对象为y的对象(两个子对象的类型为{{1} }})。

这只是术语......

答案 2 :(得分:1)

bbxyA b子对象的完整对象。