多重继承与虚函数联系起来会出现很多的问题:
1.继承类有几份虚表?
2.继承类新添加的虚函数会放到基类1的虚表?还是基类2的虚表?还是都放?
3.将基类对象指针动态转化为继承类指针的大概过程?
我们通过下面的例子来一一解答:
两个基类Base1,Base2,一个派生类Test公有继承这两个类,既有重写的虚函数,也有新添加的虚函数
![](https://i-blog.csdnimg.cn/blog_migrate/a6210889970aacf9342279177b1e72f7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c5e8b9228c51a603fba92043c94b3461.png)
1.继承类有几份虚表?
我们运行一下程序来看一下监视器:
![](https://i-blog.csdnimg.cn/blog_migrate/3b64c813bb389de874609b40e9431148.png)
结论:当派生类继承了多少个基类,就会有几份虚表。
2.继承类新添加的虚函数会放到基类1的虚表?还是基类2的虚表?还是都放?
![](https://i-blog.csdnimg.cn/blog_migrate/57abcb130ef76025efb30015c490ed3a.png)
结论:继承类中新添加的虚函数只会添加到第一个继承的基类的虚表之中
3.将基类对象指针动态转化为继承类指针的大概过程?
将先继承的基类指针动态转化为继承类指针
![](https://i-blog.csdnimg.cn/blog_migrate/02899c466a361db62c9dda0ca49cf2df.png)
将后继承的基类指针动态转化为继承类指针
![](https://i-blog.csdnimg.cn/blog_migrate/ae0d97715625c75f2a44cb5e49c9cd22.png)
总结:
在多重继承中,继承类共有继承个数个虚表
继承类新添加的虚函数会放在第一个继承的基类虚表中
在多重继承中,将基类指针动态转化为继承类指针时
先去查看此基类对象的虚表,判断是否可以转化
如果不可以:返回NULL
如果可以:
①获取指针偏移量信息(type_info类型信息中保存)
②将指针向上偏移偏移量大小的字节,并返回