关于虚函数地址的问题

看到别人的文章,知道虚函数列表存在于虚函数所在类的实例对象里,并且地址是第一个。所以可以通过实例对象找到虚函数列表,从而找到虚函数列表中的虚函数。

#include <iostream>
using namespace std;

class Base
{

public:
	virtual void f(){cout << "Base::f()" <<endl;}
	virtual void g() {cout << "Base::g()" <<endl;}
	virtual void h() {cout << "Base::h()" <<endl;}

};

void main(){
	typedef  void (* Fuc)();
	Fuc pFun;
	Base b;
	cout << "虚函数表的地址"<<(int*)&b <<endl;

	cout << "第一个虚函数的地址是:" << (int*)*(int*)&b <<endl;
	cout << " 取出该地址里的内容以int指针(int*)型输出:" << (int*)*(int*)*(int*)&b <<endl;

	cout << " 取出该地址里的内容以函数指针型(Fuc)输出:" << endl;
	((Fuc)*(int*)*(int*)&b)();
	/***********************************************************************
	 第二个函数怎么取,应该是指向该虚函数表的指针+1.指向该函数的虚函数表的指针 (int*)*(int*)&b
	第二个是 (int*)*(int*)&b+1.取出内容  *((int*)*(int*)&b+1) 转为函数指针型(Fuc)*((int*)*(int*)&b+1)
	***********************************************************************/
	cout << "第二个虚函数是:" <<endl;
	pFun=(Fuc)*((int*)*(int*)(&b)+1);
	pFun();
}


如图所示

 

 

分析:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值