记录一下C++的虚表

记录一下C++的虚表

虚表,就是一连串指向虚函数的函数地址指针。

实验说明,虚表占据大小和一个(LPVOID)大小是一样的。

32位为4字节,64位为8字节。

代码:

#include<iostream>
#include<windows.h>
using namespace std;
class A{
	int num;
};
class B{
public:
	int num;
	virtual void print1()
	{
		cout<<"this is b.print1\n"; 
	}
	virtual void print2()
	{
		cout<<"this is b.print2\n";
	}
};
class C:public B{
public:
	int num2;
	virtual void print2()
	{
		cout<<"this is c.print2\n";
	}
};
int main()
{
	cout<<"类A的大小 = "<<sizeof(A)<<endl;
	cout<<"类B的大小 = "<<sizeof(B)<<endl;
	cout<<"类C的大小 = "<<sizeof(C)<<endl;
	B* b = new C;
	b->print2();
	printf("C的虚表地址 0x%X\n",*(long*)b);
	free(b);
	b = new B;
	b->print2();
	printf("B的虚表地址 0x%X\n",*(long*)b);
	while(1);
}

输出:
image
image

因为继承的关系,B类和C类的一个虚函数地址是一样的。

再看下函数的具体内容。
image
image

可见,确确实实,有虚函数的类,确实由一个虚表,指向虚函数的地址数组。

posted @ 2022-03-30 20:27  念秋  阅读(57)  评论(0编辑  收藏  举报