C++虚函数列表布局方式计算技巧

参考:陈皓大佬的C++ 对象的内存布局(上)

           大佬的C++ 对象的内存布局(下)

学习多态时产生了如下几个问题,都在 大佬的文章里找到了答案

1、父类中不是虚函数,子类中是虚函数;多态调用时为什么不能调用子类的函数?

2、多层继承的内存布局是怎么样的?

本文是介绍总结计算技巧;代码验证的话就参考上面的两篇文章;

注:以下模型图中所有函数都是虚函数

  一、单一的一般继承

 

计算方法:

1、先Child继承Parent:将子类(Child)重写的方法覆盖父类(Parent),剩下的接到虚函数列表的最后面

2、再由GrandChild继承上面的内存:同理,将GrandChild中重写的方法覆盖上面的内存模型中,剩下的接到虚函数列表的最后面

 

二、一般的多重继承

计算方法:

1、每个父类都有自己的虚表,重写的函数都被覆盖;

2、 子类剩下的虚函数被放到了第一个父类的表中。

3、  内存布局中,其父类布局依次按声明顺序排列。

三、重复继承(非虚拟继承)

计算方法:

1、B1,B2按照单一的一般继承的方法分别继承B

2、用C中重写的方法覆盖,

3、把c中剩下的放在B1中

四、单虚拟继承(继承时使用了virtual关键字)

1、将父类(B)单独拎出放在后面,用子类(B1)中重写的方法覆盖父类中的方法;

注:如果是虚拟继承,子类(B1)的VPTR后会接一个 int* 指针,其指向的的值是-4;子类的成员结束后会有一个  NULL指针

五、多重虚拟继承

计算方法:

1、用四中的方法让B1,B2同时继承B

2、用D重写的函数覆盖前面的内容

3、把D中虚函数剩下的放入B1中

4、到上一步,虚函数列表已经画完了,但是D类的内存还没画

同单虚拟继承(继承时使用了virtual关键字)中注:注:如果是虚拟继承,子类(B1)的VPTR后会接一个  int类型的 -4;子类的成员结束后会有一个  NULL指针

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值