读书笔记 《深度探索c++对象模型》 (2)

第三章:data语意学

3.4 “继承”与Data Member

a) 只要继承不要多态 我在GCC上输出的结果是:
1
8
8
8
在VC上输出的结果是:
1
8
12
16
照书上的分析和我自己的分析应该是后者(Concrete2的bit2被放在了Concrete1的补齐空间之后,再加上自己的补齐,所以占用了12个byte,依此类推),不明白GCC是做了什么处理。

b) 加上多态

    虚指针放在头部或者尾部。

c) 多重继承

   “最左端”的基类和派生类的地址相同。

d) 虚拟继承
class中如果含有虚基类,将被分割成两个部分:一个不变局部和一个共享局部。共享局部即是虚基类部分,其位置会因为每次派生的操作会有变化,所以它们只能被间接存取。各家编译器实现的差异就是间接存取的方法,下面介绍三种主要的存取方法:
    1. 在每一个派生类对象中为每一个虚基类安插一些指针,每个指针指向一个虚基类。
     2. 每一个class object如果有一个或者多个虚基类,那么会有一个指针指向一个virtual base class table,这个表格中存放的是真正的指向虚基类的指针。
     3. 在virtual function table中放置虚基类的offset,而不是地址。

3.4 指向“Data Members”的指针 在GCC中输出的结果是:
4
8
C
说明虚指针是放在开头的。
这里注意的是float Point3d::*p2是一个指向对象成员的指针。所以&Point3d::x返回的是x在class中的offset,而&origin.x返回的是该member在内存中的真正地址。所以通过前者,不能操作一个static成员。
总之,对于类成员来说,只有虚拟继承的时候,访问虚基类的成员不能直接访问,要通过访问虚基类部分间接访问。其余的都是可以直接访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值