虚函数:实现多态的机制,多态就是用父类型的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。让父类的指针有“多种形态”,一种泛型技术。
关键字: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);