与完整对象和子对象混淆

Confusion with complete objects and sub-objects

本文关键字:对象      更新时间:2023-10-16
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 s到处都是,你能解释我的例子吗?

听起来,他们指的是由new操作符返回的对象,或者作为局部变量放在堆栈上的对象。例如,如果我们从上面的代码开始,b是x的完整对象。我们是如何得到它的?通过在层次结构中向上工作:

  1. (x)是它自己的完整对象吗?不,它是a的元素,因此一个更大物体的一部分。
  2. (A)是它自己的完整对象吗?不,它是B的超类一个更大物体的一部分。
  3. (B)是它自己的完整对象吗?是的,因为对象b是申报为b类

(如果b是一个更大的对象的一部分,那么我们将不得不在层次结构中进一步查找完整的对象)

引用自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的对象(两个子对象都是A类型)。

这只是术语…

bbxy的完整对象,是bA子对象。