本文主要是介绍【虚函数表】通过打印虚指针vptr检查是否重写父类虚函数两种情况下子类与父类的虚函数表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
首先
vptr是类对象的第一个成员,x86是4字节,x64是8字节
检查代码
int* vptr;
Animals a;
memcpy(&vptr, &a, 4);
printf("vptr=%d\n", vptr);
printf("vptr_content = %d\n", *vptr);int* vptr2;
Cat c;
memcpy(&vptr2, &c, 4);
printf("vptr=%d\n", vptr2);
printf("vptr_content = %d\n", *vptr2);
情况1:不重写父类虚函数
class Animals {
public:Animals(){}void isAnimal() {cout << "Class Animals" << '\n';}virtual void Animal(){cout << "Animal" << '\n';}
};
class Cat : public Animals
{
public:Cat(){}virtual void sAnimal(){cout << "Cat" << '\n';}
};
结果:
vptr=8100660
vptr_content = 8065034
vptr=8100680
vptr_content = 8065034
结论:
未发生覆写时,子类依然会复制一份基类的虚函数表,但是内容是一样的
情况2:重写父类函数
class Cat : Animals
{
public:Cat(){}virtual void Animal(){cout << "Cat" << '\n';}
};
结果:
vptr=7707444
vptr_content = 7671818
vptr=7707464
vptr_content = 7672993
结论:
发生覆写时,子类依然会复制一份基类的虚函数表,并且覆写的函数地址会进行替换
其他方法
打断点F10步进检查局部变量地址:
这篇关于【虚函数表】通过打印虚指针vptr检查是否重写父类虚函数两种情况下子类与父类的虚函数表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!