C++ 虚函数表及多态内部原理详解(三)

(三)多重继承(无虚函数覆盖)

下面我们再看看多重继承的情况

                                                      

对于子类实例中的虚函数表,是下面这个样子:

                                 

从图上我们可以看到

 1)每个父类都有自己的虚表。

2)  子类的成员函数被放到了第一个父类的表中。(所谓的第一个父类是按照声明顺序来判断的)

这样做就是为了解决不同的父类类型的指针指向同一个子类实例,而能够调用到实际的函数。

虚函数列表访问代码如下

 

运行结果如下:

在这个程序中,子类有多个父类,因此从每个父类都继承了一个虚表,因此会有3个虚表,排列的顺序和继承的顺序一样,自己的虚函数放在第一个虚表的后面。程序中没有改写虚函数 ,因此没有覆盖,同时应用的是一个二重指针,利用二位数组取出地址,减少了一些强制转化,注释的就是利用强制转化的,和很复杂,输出的1是虚表的最后一个单元,表明后面还有虚表,最后一个虚表的最后单元输出0,表示是最后一个虚表。

 

(四)多重继承(有虚函数覆盖)

下面我们再来看看,如果发生虚函数覆盖的情况。

下图中,我们在子类中覆盖了父类的f()函数。

                                          

 

子类虚函数列表如图所示

                     

个父类虚函数表中的f()的位置被替换成了子类的函数指针。这样,我们就可以任一静态类型的父类来指向子类,并调用子类的f()了。

子类虚函数列表访问代码如下:

 

运行结果如下所示:

  

本程序中,子类重写了f函数,把所有父类里面的f函数都屏蔽了。在虚表中父类f函数的位置全部换成了子类f函数的地址。因此在输出时父类的f函数没有了,全部是f函数的输出。

发布了41 篇原创文章 · 获赞 136 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/songguangfan/article/details/87950555