这里唯一想说明的一点就是,使用虚函数继承时,当继承类被强转成基类后调用虚函数,调用的还是继承类的虚函数。而重载方式的继承类被强转成基类再调用重载函数,则调用的是基类的函数。废话不多说,上代码:
这段代码执行的输出是:
A::fun
AP:fun
B:fun
B:fun
通过汇编分析主要的代码片段如下:
其中fun_GetAPFuns函数,就是获取AP实例被强转后的函数表地址,函数定义如下:
不难看出,针对((A*)&ap)->fun(); 这行代码调用,实际上是先获取了基类的函数表,然后又被继承类的函数表覆盖了。因此输出结果才会是AP:fun。
而对于直接重载继承的经过强转调用,在编译时就直接替换成基类的函数调用了。