学习多态时产生了如下几个问题,都在 陈皓大佬的文章里找到了答案
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指针