虚函数的实现原理--c++虚函数表解析
来源:互联网 发布:1.5v单片机 温湿度测量 编辑:程序博客网 时间:2024/06/03 16:22
这里有一篇博客介绍的很详细:c++虚函数表解析
笔记与理解
- typedef void(*Fun)(void);// 这是将Fun定义为一个指向 void (void) 函数类型的函数指针
&b
;// 得到对象的地址(开头)
(int*)(&b);
// 虚函数表的地址存在对象最前面的位置的指针中(保证最快的取到虚函数表), 取址,解释为指针(int*)* (int*)(&b);
//对指针解引用,得到指向虚函数表(指针数组)的指针,函数表中存放着指向函数的指针。*(*(int**)(&b)+2);
// 在函数数组中向后移动两位,取出其中的函数指针。pFun = (Fun)*((int*)*(int*)(&b));
// 将函数指针的类型转换为Fun,并赋值给pFun。- pFun();// 调用函数指针对应的函数。
听说配张图更好理解:
之前觉得看不懂就是被博主的指针使用给绕进去了,因为存在强制类型转换,所以指针的类型并不重要,只是有点影响理解……
改写代码:
#include <iostream>class Base{ virtual void f() { std::cout << "Base::f" << std::endl; }; virtual void g() { std::cout << "Base::g" << std::endl; }; virtual void h() { std::cout << "Base::h" << std::endl; };};int main(){ typedef void(*Fun)(); Base b; Fun pFun = NULL; std::cout << "虚函数表地址:" << (int*)(&b) << " " << &b << std::endl; std::cout << "虚函数表 — 第一个函数地址:" << *(int**)(&b) << std::endl; std::cout << "虚函数表 — 第一个函数地址:" << (int*)*(int*)(&b) << std::endl; // Invoke the first virtual function pFun = (Fun)*(*(int**)(&b)+2); pFun();// 函数指针可以直接调用,也可解引用后调用 (*((Fun)*(*(int**)(&b) + 2)))();// 解引用调用
其他地方想到再写~
纯属自己的想法,如有不对请指正
0 0
- 虚函数的实现原理--c++虚函数表解析
- 【编程语言】c++--虚函数表解析
- C++虚函数表解析
- C++ 虚函数表解析(难点*)
- [C++](转载)虚函数表解析
- 虚函数表解析
- 虚函数表解析
- 虚函数表解析
- 虚函数表解析
- 虚函数表解析
- 虚函数表解析
- 虚函数表解析
- 虚函数表解析
- 虚函数表解析
- 虚函数表解析
- 虚函数表解析
- 虚函数表解析
- 虚函数表解析
- file上传文件,js中获取文件大小
- 知晓当前是在哪一个活动
- xfire设置连接超时问题
- Struts 2 override the interceptor parameters
- Java8改进的HashMap和Hashtable实现类
- 虚函数的实现原理--c++虚函数表解析
- git 点滴
- Cocoa和Cocoa Touch介绍
- xshell连接不了opensuse linux解决办法
- Git基础- 远程仓库操作
- HashMap实现原理分析
- 关于表单提交的两种方式,post和get
- 利用Div设计TabControl效果
- 第一章 andriod studio 安装与环境搭建