对虚函数、虚表的认识
虚函数:实现多态的机制,多态就是用父类型的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。让父类的指针有“多种形态”,一种泛型技术。
关键字:virtual
虚函数表:此表中,主要是一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其内容真实反映实际的情况。
在C++标准规格说明书中说到,编译器需要保证虚函数表的指针在于对象实例中最前面的位置。(保证正确取到虚函数的偏移量)
如何访问虚表?
class Base { public: virtual void fun1() { cout << "Base:fun1()" << endl; } virtual void fun2() { cout << "Base:fun2()" << endl; } virtual void fun3() { cout << "Base:fun3()" << endl; } private: int x; }; typedef void (*pFun)(); void main() { Base b; cout <<hex<< *(int*)(&b) << endl; //获得虚表指针 pFun fun = (pFun)*(((int*)*(int*)(&b))+1); //获得虚表中函数的地址 fun(); }
解释:根据前面知识,我们得到类实例所占空间的前四个字节空间为虚表地址。故__vfptr = *(int*)(&b)表示虚表的地址;然后在虚表的结构中,每个函数的地址也占用四个字节空间。
故Base:a() =*(((int*)(*(int*)(&b)))+0);