《深入探索C++对象模型》第三章:Data语意学

26 篇文章 1 订阅

我们先来看一个问题,关于菱形继承:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值