C++继承中的内存布局阅读笔记

2010-12-231.以字母类为例:

 

输出结果为:

C->0012ff58

B->0012ff5c

A->0012ff58

说明A和C指向同一位置,B和其相差4字节(一个int型的空间)。

 VC++ 按照基类的声明顺序 先排列基类实例数据,最后才排列派生类数据。当然,派生类数据本身也是按照声明顺序布局的.

 

2.virtual继承

我们可以得到如下关于VC++虚继承下内存布局的结论:

1 首先排列非虚继承的基类实例;
2 有虚基类时,为每个基类增加一个隐藏的vbptr,除非已经从非虚继承的类那里继承了一个vbptr;
3 排列派生类的新数据成员;
4 在实例最后,排列每个虚基类的一个实例。

 

3.vritual  变量地址的访问

虚继承: 当类有虚基类时,访问非虚基类的成员仍然是计算固定偏移量的问题。然而,访问虚基类的成员变量,开销就增大了 , 因为必须经过如下步骤才能获得成员变量的地址:
1. 获取“虚基类表指针”;
2. 获取虚基类表中某一表项的内容;
3. 把内容中指出的偏移量加到“虚基类表指针”的地址上。

 

 

4.虚函数是动态联编的基础,虚函数是成员函数,且为非static的成员函数。

如果某类中的一个成员函数被说明为虚函数,就意味着该成员函数在派生类中可能有不同的定义,就是我们常说的重定义。(这里要注意区分三个概念,一个是重载,一个是重定义,一个是重写)当使用这个成员函数操作指针或引用所标识的对象时,将对该成员函数调用采取动态联编方式,即在运行的时候进行关联或者束定。


动态联编只能通过指针或者引用标志对象来操作虚函数,如果采用一般类型的标志对象来操作虚函数,则将采用静态联编的方式来调用虚函数。

 

 

 

5.

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值