从虚函数表中获取虚函数地址

本文详细解析了C++中带有虚函数的类如何通过虚函数表实现多态性。通过实例展示了如何获取虚函数表地址及访问虚函数的具体位置。
class A {
public:
	virtual void fun1() {}
	virtual void fun2() {}
};
int main()
{
	A a;
//  1.&a代表对象b的起始地址
//  2.(intptr_t*)&a 强转成intptr_t*类型,为了后面取b对象的一个指针宽度的字节,这是虚表指针
//  3.*(intptr_t*)&a 取一个指针宽度的字节,即vptr虚表地址
	cout << "__vfptr地址:" << &a << endl;//带有虚函数的虚函数表指针的地址为类对象的起始地址
	cout << "__vfptr指针变量的值也就是虚函数表(指针数组)的起始地址:" << (void*)*(intptr_t*)&a << endl;//偏移一个指针宽度

//  根据上面的解析我们知道*(intptr_t*)&b是vptr,即虚表指针.并且虚表是存放虚函数指针的
//  所以虚表中每个元素(虚函数指针)为(intptr_t *)*(intptr_t *)&a
//  这样强转后为了后面的一个指针宽度.所以*(intptr_t*)*(intptr_t*)&a就是虚表的第一个元素.即fun1()的地址.
//  那么接下来的取第二个虚函数地址也就依次类推.  始终记着vptr指向的是一块内存,
//  这块内存存放着虚函数地址,这块内存就是我们所说的虚表.
	cout << "虚函数表第一个虚函数指针的地址:" << (void*)*(intptr_t*)*(intptr_t*)&a << endl;//再次偏移一个指针宽度得到虚函数表中第一个虚函数的地址
	cout << "虚函数表第二个虚函数指针的地址:" <<(void*)*((intptr_t*)*(intptr_t*)&a+1) << endl;//通过虚函数表中第一个虚函数的地址的偏移量+1得到第二个虚函数的地址
	system("pause");
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值