Chinaunix首页 | 论坛 | 博客
  • 博客访问: 770957
  • 博文数量: 95
  • 博客积分: 6011
  • 博客等级: 准将
  • 技术积分: 1342
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-12 16:58
文章分类

全部博文(95)

文章存档

2009年(44)

2008年(51)

我的朋友

分类: C/C++

2008-09-03 20:29:26

(五)多重继承且无虚函数

1. 定义与实验

定义C015是一个空类从C010和C011继承。

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:

    

C016:
    

 
 

3. 相关说明

  C015的大小为3字节,也就是C010和C011的大小之和,对象的内存值为0x010203。
这里我们可以发现父类的成员变量悉数被子类继承,并且于继承方式(公有或私有)无关,如C015是私有继承自C011。继承方式只影响数据成员的“能见 度”。子类对象中属于从父类继承的成员变量由父类的构造函数初始化。通常会调用默认构造函数,除非子类在它的构造函数初始化列表中显式调用父类的非默认构 造函数。如果没有指定,而父类又没有缺省构造函数,则会产生编译错误。
  C016它的大小为7字节,也就是C015的大小(也即是C010和C011的大小和)加上自身的4字节int变量之和。同样对象的内存输出也验证了这一点,前三个字节为从父类继承的,后4个字节为自身的int变量,值为1。
  因此关于普通继承,子类的对象布局为父类中的数据成员加上子类中的数据成员,多层继承时(如C016),顶层类在前,多重继承时则最左父类在前。

阅读(914) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~