2011-11-18 77 views
1
class A { 
int x; 
}; 

class B : public A { 
int y; 
}; 

B b; 

我知道b被认为是B一个完整的对象和B包含为A子对象的对象。混淆完整的对象和子对象

但有人向我指出这一点,

第3款,C++标准1.8

(1.8/3)对于每一个对象x的,有一些对象调用x的完整 对象,确定如下: - 如果x是一个完整的对象,那么x是x的完整对象。 - 否则,x 的完整对象是包含x的(唯一)对象的完整对象。

在这里,我发现所有的地方所有那些x的混淆的字眼,你能解释一下我的例子吗?

+2

这是从哪里摘录?我从来没有听说过完整的对象子对象gobbledygook。他们称他们为我来自的对象和课程。 –

回答

1

bbxy完整的对象和所述子对象Ab的。

+0

你的意思是'b'是'B'的完整对象吗?我不明白'b'本身是完全的'b'对象吗? – user103214

+0

@user:你也可以只说'b'是*完整的对象。 – Xeo

+0

我现在看到,没有注意到它在为宇宙中的每个物体说话。 – user103214

3

它的声音对我说的“完整的对象”他们指的是由新的经营者退回,或存放在堆栈中为局部变量的对象。例如,如果我们从上面的代码开始,那么b是x的完整对象。我们是如何得到这个的?通过按照我们的层次结构:

  1. 是(x)它自己的完整对象吗?不,它是A的成员,因此是更大对象的一部分。 (A)它自己的完整对象?不,它是B的超类,因此是更大对象的一部分。
  2. 是(B)它自己完整的对象?是的,因为对象B被声明为B型的

(如果B的,而不是被一个仍然较大的物体的一部分,那么我们将不得不进一步上升的结构,找到完整对象)

+0

好分层的解释。 +1 – Xeo

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(和两个子对象的类型A)。

这只是术语...