我们先来看一个问题,关于菱形继承:
class top{};
class left:public virtual top{};
class right:public virtual top{};
class bottom:public left,public right{};
那么,我想问的是 这四个class的大小分别是多少?我在g++ 4.8上做了验证(64位系统):
这个结果应该算是在意料之内,下面再来看个例子:
把虚继承去掉:
class top{};
class left:public top{};
class right:public top{};
class bottom:public left,public right{};
这个例子可以说明一个问题,普通继承的时候,如果基类为空(或者不含普通成员变量、虚...),则在派生类中是相当于空的,不占用空间。但是这个例子可以却不一样,属于菱形继承问题,会随着base增多依次增大(不同编译器不一样)。
1、Data Member的存取
我们来探讨一下使用对象存取成员和使用指针存取有什么不同。书中是这么解释的:当class是一个derived class,我们就不能够确定该指针必然指向哪个class type,只能延迟到执行期来判断.....
(1)Static Data Members
每个静态数据成员都只有一个实例,每次程序存取的时候,会被内部转化为对该唯一extern实例的直接参考操作。从指令执行的观点来看,这是C++语言中通过一个指针和通过一个对象来存取数据成员结论完全相同的唯一一种情况。
(2)Nonstatic Data Members
这种情况即使开头所说,对象和指针存取会有差别
2、继承与Data Member
这个部分,其实我们在一开始就进行的探讨,注意的地方是普通继承下的菱形继承问题。我们着重探讨一下虚拟继承的布局问题,这篇博文说的很好:http://www.oschina.net/translate/cpp-virtual-inheritance
..感觉第这一章节没什么讲的...so,over