C++ 虚函数表研究 (一) 单继承
本文研究单继承情况下,c++对象的虚函数表的具体情况。所用的编译器为vc6.0。
假设有两个类A,B, 其中B由A派生出来,A含有虚函数fun1,B含有虚函数fun2
A 的定义如下:
B的定义如下:
测试的代码如下:
测试代码说明:
虚函数表指针 (int *)(&b)
虚函数表地址 *(int *)(&b)
虚函数表的第一个元素,也就是指向fun1的指针 (int * )(*(int *)(&b))
虚函数表的第二个元素,也就是指向fun2的指针 (int * )(*(int *)(&b))
那么通过下面的语句就可以访问到虚函数:
Fun fun1=( Fun) ( *(int *) *(int *)(&b));
fun1();
Fun fun2=(Fun) (* ((int *) (*(int *)(&b))+1));
fun2();
程序运行结果:
虚函数表指针的地址为:0012FF7C
虚函数表的地址为:4653200
第一个虚函数fun1的地址为:00470090
A::fun1
第二个虚函数fun2的地址为:00470094
B::fun2
那么就可以得出下面的结论:
在这种单继承的情况下,如果有虚函数表,那么只有一个虚函数表,并且按照虚函数声明的顺序顺序排列,派生类的虚函数紧接着基类的虚函数排列,类B的虚函数表结果如下图所示: