全部博文(95)
分类: C/C++
2008-09-03 20:29:26
1. 定义与实验
struct C010
{
C010() : c_(0x01) {}
void foo() { c_ = 0x02; }
char c_;
};
struct C011
{
C011() : c1_(0x02), c2_(0x03) {}
char c1_;
char c2_;
};
struct C015 : public C010, private C011
{
};
运行如下代码打印它们的大小及对象中的内容。
PRINT_SIZE_DETAIL(C015)
结果为:
The size of C015 is 3
The detail of C015 is 01 02 03
我们可以再加一层继承来验证一下。定义类C016,从C015继承,并有自己的4字节int成员变量。
struct C016 : C015
{
C016() : i_(1) {}
int i_;
};
运行如下代码打印它的大小及对象中的内容。
PRINT_SIZE_DETAIL(C016)
结果为:
The size of C016 is 7
The detail of C016 is 01 02 03 01 00 00 00
2. 对象布局
C015:
3. 相关说明
C015的大小为3字节,也就是C010和C011的大小之和,对象的内存值为0x010203。
这里我们可以发现父类的成员变量悉数被子类继承,并且于继承方式(公有或私有)无关,如C015是私有继承自C011。继承方式只影响数据成员的“能见 度”。子类对象中属于从父类继承的成员变量由父类的构造函数初始化。通常会调用默认构造函数,除非子类在它的构造函数初始化列表中显式调用父类的非默认构 造函数。如果没有指定,而父类又没有缺省构造函数,则会产生编译错误。
C016它的大小为7字节,也就是C015的大小(也即是C010和C011的大小和)加上自身的4字节int变量之和。同样对象的内存输出也验证了这一点,前三个字节为从父类继承的,后4个字节为自身的int变量,值为1。
因此关于普通继承,子类的对象布局为父类中的数据成员加上子类中的数据成员,多层继承时(如C016),顶层类在前,多重继承时则最左父类在前。