当前位置: 首页 > news >正文

网站做系统叫什么2020最近的新闻大事10条

网站做系统叫什么,2020最近的新闻大事10条,wordpress 文章点赞插件,门户网站建设美丽尝试修改虚函数表 本期纯整活儿好吧!!!! 初衷 有一天我突然开始好奇虚函数表是否真的存在,于是我开始想是否能够从C中查看或者调用虚函数表中的内容。,于是有了下面的操作。 操作过程 起初我并没有思路…

尝试修改虚函数表

本期纯整活儿好吧!!!!

初衷

有一天我突然开始好奇虚函数表是否真的存在,于是我开始想是否能够从C++中查看或者调用虚函数表中的内容。,于是有了下面的操作。

操作过程

起初我并没有思路,但是我知道,每一个类对应一个虚函数表,因此首先我需要一个虚函数,因此我随便写了一个基类:

class Base {
public:void output() {cout << "Class Base" << endl; };virtual void say() {cout << "Class Base" << endl;}
};

然后写一个子类,去 override 一下他的这个函数:

class A : public Base {
public:void output() {cout << "Class A" << endl;}void say() override {cout << "Class A" << endl;}int x;
};

然后按照同样的方式再创建一个 B 类:

class B : public Base {
public:void output() {cout << "Class B" << endl;}void say() override {cout << "Class B" << endl;}
};

这样以来,应该会有三个虚函数表,分别是:

  • Base基类对应的虚函数表
  • A类对应的虚函数表
  • B类对应的虚函数表

然后如何调用他们呢?我想了好久,想出这样的一个方法:

int main() {A a;B b;cout << "A's virtual table address : " << ((void **)(&a))[0] << endl;cout << "A's virtual table address : " << ((void **)(&b))[0] << endl;return 0;
}

根据理论来说,C++中的虚函数表应该在类内空间的第一个位置,占八个字节,是一个指向函数表的指针,那么我们就应该这样做:

((void **)(&b))[0];

这会返回一个虚函数表的地址。

这句话是什么意思呢?首先我们要清楚,对象的空间分配与结构体是一样的,而根据理论来看,虚函数表的指针会被编译器自动添加在对象空间的初始位置,也就是说,对象所在的空间的第一个单元存储的是虚函数表的地址。

如何获得这个首地址呢?首先我们要像取数组首地址一样,用取地址符号获得对象的首地址。然后将其强制转换为 (void **) 类型,这相当于让电脑将这个对象的空间看作一个数组,这个数组中存放的全部都是指向 void * 类型的数据的地址。

void * 类型是函数指针类型,我们不用管,最后在末尾添加[0]就相当于得到了虚函数表的地址。

尝试输出一下:
1
嗯,看起来没啥问题,但是如何证明他是个虚函数表的地址呢?

我能否将一个类中的修改到另一个虚函数表中?然后让这个对象执行的时候出现另外一个类的动作?

于是我开始了下面的尝试:

int main() {A a;B b;cout << "Class A virtual table address : " << ((void **)(&a))[0] << endl;cout << "Class B virtual table address : " << ((void **)(&b))[0] << endl;((void **)(&a))[0] = ((void **)(&b))[0]; // 把b对应的类的虚函数表覆盖到a上a.say(); // 如果虚函数表被覆盖了的话,那么就会出现a执行了b的say方法的状况b.say();return 0;
}

然而结果是这样的:

2
发现结果并没有被改变,这是怎么回事?我百思不得其解,多方询问过之后了解到是gcc编译器把我的虚函数的调用过程给优化掉了,无奈我只能使用指针和引用来赋值:

int main() {A a;B b;Base *ap = &a, *bp = &b;cout << "Class A virtual table address : " << ((void **)(&a))[0] << endl;cout << "Class B virtual table address : " << ((void **)(&b))[0] << endl;((void **)(&a))[0] = ((void **)(&b))[0]; // 把b对应的类的虚函数表覆盖到a上ap->say(); // 如果虚函数表被覆盖了的话,那么就会出现a执行了b的say方法的状况bp->say();return 0;
}

3
执行成功啦!!!

其实后面我还做了很多好玩的操作,这里先不放出来,写的有点累,下次再凑出一篇来!

:wq 拜拜~~

http://www.ds6.com.cn/news/50891.html

相关文章:

  • 做区位图的网站整合营销理论主要是指
  • 微信文档企业seo网络推广
  • 局域网的电脑怎么做网站服务器中国建设网官方网站
  • 如何利用阿里云做网站台州seo优化
  • 网站建设的内容如何进行网络推广营销
  • 做美食推广的网站有哪些德州百度推广公司
  • 最权威的做网站设计哪家好江门seo推广公司
  • 防止网站流量被刷产品营销方案策划
  • wordpress 简码广州网站优化费用
  • 个人做电商怎么入门seo排名优化培训价格
  • 网站优化哪家好百度一下你就知道了百度一下
  • 郑州网站关键字优化全网推广公司
  • 网站截图环境 php合肥seo优化排名公司
  • 0基础建站网站搭建教程迅雷磁力链bt磁力天堂
  • 做网站的程序网站排名优化价格
  • 做企业网站需要什么宁波网络营销怎么做
  • 合肥做网站行吗seo优化技术厂家
  • 白鹭引擎可以做网站吗电商网站建设制作
  • 优化网站建设公众号排名优化软件
  • 网站计划任务怎么做淘宝的关键词排名怎么查
  • 制作网站公司诈骗今日新闻十大头条内容
  • 做电影视频网站赚钱嘛开发制作app软件
  • 邢台网站设计厂家网络seo关键词优化技巧
  • 有做赛车网站的吗朋友圈广告推广平台
  • 枣庄手机网站建设报价aso关键词搜索优化
  • 西安做网站的公司地址长尾关键词网站
  • 做饲料机械的网站seo在哪可以学
  • 百浪科技做网站怎么样重庆百度推广的代理商
  • 怎么做自己的网购网站网站推广的技巧
  • 口碑好的郑州网站建设关键词排名关键词优化