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

(转载)虚函数剖析

转载http://www.cnblogs.com/riskyer/p/3217872.html

    所谓虚函数,虚就虚在推迟联编或者动态联编上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被称为函数。

而什么是动态联编呢?

           编译程序在编译阶段并不能确切地知道将要调用的函数,只有在程序执行时才能确定将要调用的函数,为此要确切地知道将要调用的函数,要求联编工作在程序运行时进行,这种在程序运行时进行的联编工作被称为动态联编,或动态束定,又叫晚期联编;C++规定:动态联编是在虚函数的支持下实现的;

          虚函数是动态联编的基础;虚函数是成员函数,而且是非静态的成员函数;虚函数在派生类中可能有不同的实现,当使用这个成员函数操作指针或引用所标识的对象时,对该成员函数的调用采用动态联编方式,即:在程序运行时进行关联或束定调用关系;
          动态联编只能通过指针或引用标识对象来操作虚函数;如果采用一般的标识对象来操作虚函数,将采用静态联编的方式调用虚函数;

 

           如果一个类具有虚函数,那么编译器就会为这个类的对象定义一个指针成员,并让这个指针成员指向一个表格,这个表格里面存放的是类的虚函数的入口地址;比如:一个基类里面有一些虚函数,那么这个基类就拥有这样一个表,它里面存放了自己的虚函数的入口地址,其派生类继承了这个虚函数表,如果在派生类中重写/覆盖/修改了基类中的虚函数,那么编译器就会把虚函数表中的函数入口地址修改成派生类中的对应虚函数的入口地址;这就为类的多态性的实现提供了基础;

 

多态是什么?

               在程序设计领域,一个广泛认可的定义是一种将不同的特殊行为和单个泛化记号相关联的能力。和纯粹的面向对象程序设计语言不同,C++中的多态有着更广泛的含义。除了常见的通过类继承和虚函数机制生效于运行期的动态多态(dynamic polymorphism)外,模板也允许将不同的特殊行为和单个泛化记号相关联,由于这种关联处理于编译期而非运行期,因此被称为静态多态(static polymorphism

 

             说了这么多虚函数,我们要知道虚函数是面向对象程序设计的关键部分,虚函数需要借助指针和引用来实现多态,   而对象的多态性需要通过虚表和虚表指针来完成,虚表指针被定义在对象首地址的前4个字节处。因此虚函数必须作为成员函数使用。(访问虚函数需要this指针。)

转载于:https://www.cnblogs.com/ztteng/p/3419878.html

相关文章:

  • EBS adpatch logfile : log, lgi
  • WCF 有零个操作;协定必须至少有一个操作
  • Oracle EBS 如何生成trace文件
  • 《常微分方程教程》习题2.4.1,(4)
  • 掌握python机器学习-读书笔记4(特征选择)
  • JAVA中Get和Post请求的区别
  • Flask使用Flask-SQLAlchemy操作MySQL数据库
  • Windows Azure 网站上的 WebSocket 简介
  • 开源倾情奉献:基于.NET打造IP智能网络视频监控系统(三)命令行工具集
  • 浅谈硬盘构造及IOPS的计算
  • 把用户加入sudo
  • 点滴积累【JS】---JS小功能(button选择颜色)
  • Nginx、LVS及HAProxy负载均衡软件的优缺点详解
  • 面向对象实验四(输入输出流)
  • 苹果屏幕分辨力和像素
  • hexo+github搭建个人博客
  • 收藏网友的 源程序下载网
  • [笔记] php常见简单功能及函数
  • “大数据应用场景”之隔壁老王(连载四)
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【React系列】如何构建React应用程序
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • canvas 绘制双线技巧
  • HTTP中的ETag在移动客户端的应用
  • java概述
  • Linux链接文件
  • Node 版本管理
  • oldjun 检测网站的经验
  • Protobuf3语言指南
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Vue全家桶实现一个Web App
  • 测试如何在敏捷团队中工作?
  • 第十八天-企业应用架构模式-基本模式
  • 关于Java中分层中遇到的一些问题
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 前端面试总结(at, md)
  • 前端设计模式
  • 手机端车牌号码键盘的vue组件
  • 与 ConTeXt MkIV 官方文档的接驳
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • ​油烟净化器电源安全,保障健康餐饮生活
  • (007)XHTML文档之标题——h1~h6
  • (13)Hive调优——动态分区导致的小文件问题
  • (4.10~4.16)
  • (C#)一个最简单的链表类
  • (Git) gitignore基础使用
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (十六)Flask之蓝图
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)shell调试方法
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • . NET自动找可写目录