关于虚函数表的小结

当类中如果存在虚函数,那么就会在类对象地址的开始位置增加4字节用于存储指向虚函数表的地址,

例如:

class base

{

public:

void func() {}

//virtual void f() {cout<<"base::f";}

};

void main()

{

base b;

cout<<sizeof(base)<<endl;//1

//cout<<sizeof(base)<<endl;//4

}

关于虚函数表

可以获取对应指向虚函数表的地址:

int* pt = NULL;

pt = (int*)(&b);

可以获取指向虚函数表第一个函数的地址

int *pt1 = NULL

pt1 = (int*)*pt;

可以通过函数指针来进行虚函数表中第一个函数值的输出:

typedef void (*Fun)(void);

Fun pFun = NULL;

pFun = (Fun)(*pt1);

pFun();//输出base::f

//这里需要注意的一种情况就是如果是多重继承,那么继承类中没有被覆盖的虚函数,只存在第一个基类的虚函数表中,例如

class base1

{

public:

 virtual void f(){cout<<"base1::f";}

 virtual void g(){cout<<"base1:g";}

};

class base2

{

public:

 virtual void f(){cout<<"base2::f";}

virtual void g(){cout<<"base2::g";}

};

class A : public base1, public base2

{

public:

 virtual void f(){cout<<"A::f";}

 virtual void g1(){cout<<"A::g1";}//未被覆盖的虚函数

};

typedef void(*Fun)(void);

int main()

{

 A a;//通过查看a对应的虚函数列表

//base1--->A::f base1::g A::g1

//base2---->A::f base2:g

//此时通过上面的方法可以直接访问得到A::g1

int* pt = (int*)(&a);

int*pt1 = (int*)(*pt);

Fun pFun = NULL;

pFun = (Fun)(*(pt1+2));

//当然由于这里是多重继承,访问base2虚函数表时要用到指针的指针,不妨直接用二维数组进行访问

//int** pt = (int**)(&a);

//fun pFun = (Fun)(pt[0][2]);//与上面是一样的效果

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值