C++虚表指针的一个问题,和我预期的结果有点差距.
我知道C++内存对象模型的基本知识,对于一个有virtual函数的类而言,实例的第一个size_t大小是指向虚表的指针。
因此我写了下面一个在vc下编译的小程序,是可以执行的。
这个类有3个函数,分别叫f/g/h,我不用类的方法调用,而是用指向虚表的实例头部来操作。
class Father
{
public:
int i;
Father(){i=22;}
virtual void f(){printf("f\n");}
virtual void g(){printf("g\n");}
virtual void h(){printf("h\n");}
};
typedef void (*pFather)(Father*);
int main(int argc, char* argv[])
{
Father* pf=new Father;
pFather *pVtable=*(pFather**)(pf);
pVtable[0](pf);
pVtable[1](pf);
pVtable[2](pf);
delete pf;
return 0;
}
class Father
{
public:
int i;
Father(){i=22;}
virtual void f(){printf("f:%d\n",i);}//这一行打印的i是个无效值。
virtual void g(){printf("g:%d\n",++i);}//++i导致崩溃。
virtual void h(){printf("h\n");}
};
typedef void (*pFather)(Father*);
int main(int argc, char* argv[])
{
Father* pf=new Father;
pFather *pVtable=*(pFather**)(pf);
pVtable[0](pf);
pVtable[1](pf);
pVtable[2](pf);
delete pf;
return 0;
}
typedef void (_fastcall *pFather)(Father*);