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指针

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章