C++中虚继承下派生类object布局

C++虚继承下派生类object布局

目录

一.      背景知识... 2

1.1.        虚函数表(vftable)2

1.2.        虚基表(vbtable)... 2

二.      场景分析... 3

2.1.        全部都是虚基类... 3

2.2.        有的基类不是虚基类... 3

 

 

一. 背景知识

如果您觉得错误之处可以随时联系我,还请多多关照。

1.1.         虚函数表(vftable)

虚函数表中保存着一个类所有虚函数的地址。继承时会更新虚函数覆盖后的新地址。编译器将在该类的object中插入一个vfptr指针,并在该object初始化的时候让vfptr指向该表。一个派生类可以有多个vftable,有的编译器将对此进行优化,合成一个表,每个子表中需要包含其首地址到第一个vftable的偏移量。但是object的vfptr指针还是会有多个。


1.2.         虚基表(vbtable

虚基表和虚函数表类似,不过存储的不是地址,而是偏移量,每个派生类对象中有一个vbptr指针指向该表,第一个偏移量是派生类object自身的vbptr指针到其首地址的偏移量,之后依次存储每个虚基类subobjects与该vbptr指针之间的偏移量。


二. 场景分析

2.1.         全部都是虚基类

如果派生类有自己特有的虚函数的话,编译器将创建一个新的vftable,并在派生类object首地址插入一个vfptr指向该表,然后依次是vbptr,每个object只有一个vfptr和一个vbptr,而且vfptr在vbptr之前,其他的vfptr和vbptr属于虚基类subobjects的。两个指针之后就是派生类自己的nonstatic data member了。后面的话是虚基类各自的subobjects。

2.2.         有的基类不是虚基类

       从派生列表中依次找,找到第一个含有虚函数表的基类,将其subobjects放在派生类object首地址,之后安排其他nonvirtual base class的subobjects,这些都排列完毕之后才是派生类自己的vbptr,vbptr指针后面跟着自己的nonstatic data members,之后才是virtual base class subobjects。

 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值