继承/虚拟继承/虚表

继承的分类:

1.单继承

              

创建一个Student的对象,看一下他的内存分布是怎样的:

     

2.多继承

对虚函数进行重写的多继承:

3.多重继承

4.菱形继承

 

虚拟继承

在虚拟继承中,我们可以看到,子类成员和基类成员的存储顺序发生了改变,并且在b对象的前四个字节中存放了一些东西,是我们呢不曾了解的:,下面就来研究一下:

在观察前四个字节中存放的内容中,我们可以看到存放了0和8,通过了解知道8代表着基类对象成员在子类对象中与子类对象首地址的偏移量。减去=8。

将派生类的前四个字节所指向的内容叫做偏移量表格

菱形虚拟继承

还记得之前普通菱形继承中成员_a在继承中,B和C对象中都有一份_a,这就叫数据冗余,用虚拟菱形继承可以解决

这里可以分析出D对象中将_a放到的了对象组成的最下面,这个_a同时属于B和C,那么B和C如何去找到公共的A呢?这里是通过了B和C的两个指针,指向的一张表。这两个指针叫虚基表指针,这两个表叫虚基表。虚基表中存的偏移量。通过偏移量可以找到下面的A。
 

菱形虚拟继承虽然解决的菱形继承里子类对象包含对分父类对象的数据冗余浪费空间的问题,单因为要给对象分配内存去存储虚表,但也带来了性能上的损耗

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值