C++中虚函数和非虚函数重载在继承时的区别

      这里唯一想说明的一点就是,使用虚函数继承时,当继承类被强转成基类后调用虚函数,调用的还是继承类的虚函数。而重载方式的继承类被强转成基类再调用重载函数,则调用的是基类的函数。废话不多说,上代码:

 

这段代码执行的输出是:

A::fun
AP:fun
B:fun
B:fun

 

通过汇编分析主要的代码片段如下:

 
其中fun_GetAPFuns函数,就是获取AP实例被强转后的函数表地址,函数定义如下:

 

不难看出,针对((A*)&ap)->fun(); 这行代码调用,实际上是先获取了基类的函数表,然后又被继承类的函数表覆盖了。因此输出结果才会是AP:fun。

而对于直接重载继承的经过强转调用,在编译时就直接替换成基类的函数调用了。

 

 

 

 

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