通过虚函数表调用虚函数与通过虚函数表(绕过访问权限控制)

本文介绍了C++中通过虚函数表调用虚函数的原理和实践,探讨了在不同系统环境下(32位和64位)的注意事项。同时,文章讨论了如何通过虚函数表绕过访问权限控制,调用private类型的虚函数。
摘要由CSDN通过智能技术生成

一、背景知识

          在讲解虚函数的时候,我们知道,如果类中有虚函数,则该类中存在一个虚函数表(V-Table),每个该类的对象都会有一个指针指向该虚函数表,存储这类中虚函数的函数指针,而虚函数表的地址就存在该类对象内存的开始处,目的是为了方便查找虚函数。

        在陈浩的技术专栏中写过一篇对C++虚函数表解析很透彻的的文章: C++ 虚函数表解析   

        这篇文章里对虚函数表的结构做了很透彻的解析,并且配有直观的图片讲解,大家看了以后会比较明白的。这里我们着重讲下通过虚函数表调用虚函数与通过虚函数表(绕过访问权限控制)的代码实现。

二、通过虚函数表调用虚函数

在陈浩大哥的那篇文章里面提到如何通过虚函数表调用函数,并有示例代码如下:

#include<iostream>
#include<string>
using namespace std;

typedef void(*Fun)(void);

class Base {
 public:
  virtual void f() {
    cout << "Base::f()" << endl;
  }
  virtual void g() {
    cout << "Base::g()" << endl;
  }
  virtual void h() {
    cout << "Base::h()" << endl;
  }
};
上面是基类代码,Base类中依次有三个虚函数: f(), g(), h(),它们的指针也被依次存储在Base类的V-Table中。下面代码尝试通过V-Table中的虚函数指针来调用虚函数:

int main() {
  Base b;
  Fun fp = NULL;
  cout << "虚函数表地址:" << (int*)(&b) << endl;
  cout << "虚函数表第一个虚函数指针地址:" <<(int*)*(int*)(&b) << endl;
  for (int i = 0; i != 3; ++i) {
    fp = (Fun)*((int*)*(int*)(&b) + i);
    fp();
  }
  return 0;
}

我在自己电脑(64位系统)上运行上述测试代码时,运行结果如下:

虚函数表地址:0x7fff13ec2c80
虚函数表第一个虚函数指针的地址:0x400c70
Base::f()
Segment
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值