所在的环境是VS2008下的
本文中空类的定义是:没有数据成员,没有函数的类.(不包括默认的)
1、空类或者空类对象的大小(无继承关系)
输出结果:
the Animal Class space = 1
the bird space = 1
分析:
分配1字节,以避免不同对象指向同一个地址。具体为什么是1字节,我也没真正的清楚,我认为应该是空类对象的地址与该字 节的地址一致,该字节应该是编译器添加的。后续看了对象的地址就可能会是这样认识的。
补充:
在http://www.vckbase.com/bbs/prime/viewprime.asp?id=525有这样的描述:(空类)可以作为一个要定义但还没有定义 的类的占位符。例如,它可以被用作临时性的接口类,作为其它类的基础;不用等待全部实现都完成。空类还能被用于在类之间强加派 生关系,这种关系最初没有从基类祖先传下来,这被称为自底向上设计。最后,它还可以被用于为哑变量创建类型以便区分函数不同的 重载版本。事实上,操作符new就是像这样重载。
2、空类或者空类对象的大小(有继承关系)
为了不增加讨论的复杂性,这里继承的类也是空类。也假设您已经清楚了继承、虚继承的概念。
1) 继承
输出结果
the Animal Class space = 1
the bird space = 1
分析:
继承的基类都是空类,大小是1,不管有多少个父类。
2)虚继承
输出结果:
the Animal Class space = 8
the bird space = 8
分析:
对每一个虚继承基类,都有一个虚基类索引(或者偏移量、指针),占4字节。猜测这时空类对象的指针应该与某个虚基类索 引相等。
3)继承和虚继承混合
输出结果:
the Animal Class space = 4
the bird space = 4
分析:
在有虚继承的话,大小为虚继承的大小,不计算继承的空类的大小。猜测当前空类对象的地址应该与某个虚继承的基类的索 引相等。
3、总结
VS2008环境下
空类:没有数据成员,没有函数的类。(不包括默认的)
1) 无继承关系的空类大小为1;
2) 有虚继承的,对每一个虚继承基类,都有一个虚基类索引,占4字节;
3) 空类继承多个空类,大小仍然是1;
4) 空类虚继承N个空类,大小为N*4;
5) 空类虚继承N个空类,继承M个空类,大小是N*4;
6) 我认为空类的区分是默认的1字节的地址或者虚继承中的某个虚基类索引的地址,两者只取其一即可,也就是说空类对象的地址应该是与这两个中的一个相等的。