【多态】虚函数表存储在哪个区域?

A:栈
B:堆
C:代码段(常量区)
D:数据段(静态区)
答案 : 代码段(常量区)

验证如下:

class Person
{
public:
	virtual void BuyTicket() { cout << "Person::BuyTicket()" << endl; }
};
int main()
{	
	int a = 4;
	printf("栈区:%p\n", &a);
	int* c = new int;
	printf("堆区:%p\n", c);
	static int b = 3;
	printf("静态区:%p\n", &b);
	const char* d = "hello";
	printf("常量区:%p\n", d);
	Person ps;
	printf("虚表:%p\n", *((int*)&ps));
	
	return 0;
}

在这里插入图片描述
思路:比较虚函数表内存储的地址与其他存储区域的地址进行对比,看谁更接近。
通过上面的结果可以看出:虚表的地址 与 常量区的地址最为接近。

如何提取虚表的地址:首先对象第一个存储的便是虚函数表指针,因此前4个字节(32位)存储便是虚函数表的地址(int*)&ps 即是 _vfptr的地址, 再解引用便是 _vfptr存储的地址,即虚函数表的地址
在这里插入图片描述


当然:以上的结果是windows下VS2022测试的结果。
至于其他平台是否也是存储再常量区,笔者还未进行研究。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值