1.打印虚表指针
首先我们需要知道如何验证一个类是否存在虚表指针?
详情可看
2.验证打印是否正确
不存在虚表类
class CTestC
{
public:
CTestC() { m_iValueC = 0; };
~CTestC() {};
void Test()
{
cout << "测试" << endl;
};
private:
int m_iValueC;
};
int main()
{
CTestC t0;
printf("CTestC 虚表地址:%p\n", *(int *)&t);
return 0;
}
输出结果:
给Test加上virtual,输出结果:
3.新增基类
class CTest
{
public:
CTest() {};
~CTest() {};
virtual void SFunc() {
cout << "测试虚函数" << endl;
};
private:
int a;
short b;
};
class CTestC : public CTest
{
public:
CTestC() { m_iValueC = 0; };
~CTestC() {};
virtual void Test()
{
cout << "测试" << endl;
};
private:
int m_iValueC;
};
typedef void(*Fun)(void); //函数指针
int main()
{
CTest t;
printf("CTest 虚表地址:%p\n", *(int *)&t);
CTestC t0;
printf("CTestC 虚表地址:%p\n", *(int *)&t0 );
Fun pfun = (Fun)*((int *)*(int *)(&t0)); //vitural f();
printf("f():%p\n", pfun);
pfun();
return 0;
}
输出结果:
4.更加快速的验证方法
结论:
当子类没有虚函数,但是父类存在虚函数的时候,子类依旧会新建一个虚表,虚表里面存放的是父类的虚函数指针。