C++ 多态 虚函数
来源:互联网 发布:模仿神烦狗doge软件 编辑:程序博客网 时间:2024/06/14 00:41
C++编译器在编译时创建数据结构,以便在执行时支持多态。多态是通过三个层次的指针(三层间接访问)实现
第一层: 当C++编译包含一个或者多个虚函数的类时,会为这个类建立一个vtable(虚函数表)(C++中实现基类虚函数的子类的函数也是虚函数)。每当调用这个类的虚函数,正在执行的程序都会利用这个vtable选择选择合适的函数实现 (最左边) vtable中存放的是函数指针 vtable中的函数指针指向调用虚函数执行的实际函数 它是指针链的最后一环
第二层: 只要实例化带有一个或者多个虚函数的类的类对象时,编译器就会将这个对象链接到指向这个类的vtable的指针 注意是vtable指针 就是指针链的第二环
第三层:简单包含接收虚函数调用的对象句柄,这个层次的句柄也可以是应用
终于明白指针的概念,在单片机中,51是8位,指针是式8位的,可以寻址2的8次方 在计算机中 PC机是32位 指针式32位 每个指针占4个字节
结合图片 调用虚函数 编译器产生的代码执行如下几个操作(首字母小写表示对象 大写表示类)
1.选择employee中第i项,(这里即为hourlyEmployee的对象指针),并将它作为实参传递给函数,这就将baseClassPtr参数设置成了指向hourlyEmployee
2.解除这个指针的引用,获得hourlyEmployee对象。这个对象以一个指向HourlyEmployee类的vtable的指针开始
3.解除引用hourlyEmployee对象的vtable指针获得HourlyEmployee类的vtable
4.跳过4个字节的偏移量,选择print函数指针(由于print函数指针在vtable中排在第二位 跳 过第一个函数指针 共4个字节)
5.解除print函数的指针引用,形成要执行的实际函数的名称
调用每个虚函数时的指针解除引用操作和内存访问,都需要一些额外的执行时间,添加到对象的vtable和vtable指针,也需要额外的操作
由此来判断是否适合使用虚函数
- C/C++--虚函数
- 【步兵 c++】 多态&虚函数
- 【C/C++】纯虚函数
- C/C++, 虚函数表
- 【C++】虚函数 多态 再理解
- C++——虚函数、多态
- C++——多态&虚函数
- C++:虚函数用途
- 虚函数详解(C++)
- 虚函数(C++)
- c++-->虚函数 2
- C++ 虚函数
- C++:虚函数
- C++_虚函数
- 【c++】虚函数
- 【C++】虚函数
- C++ 虚函数
- [C++]虚函数
- Eclipse svn插件使用代理
- Jsmooth Java文件打包成exe文件(可以在没安装JDK的环境下运行)
- RGB转Lab的那些事(一)
- 本地tomcat访问mysql数据库
- Evernote 印象笔记离线使用方法
- C++ 多态 虚函数
- 十道海量数据处理面试题与十个方法大总结
- poj 3238
- GPS定位,经纬度附近地点查询–C#实现方法
- windos 采用IPSec策略编程实现屏蔽IP功能
- squid 配置详解+认证
- 一句话谈模拟退火
- LA 2191 - Potentiometers
- 整天吃了睡睡了吃,出门也是买吃的买睡的,这他吗的什么日子,无聊透顶,shuihuo、lanhuo... ...