C++中这两个概念不容易区分。

首先这两个函数都是为了方便使用多态这种面向对象的特性。下面将介绍两个函数的不同点。

虚函数:

一个类中定义了虚函数,通过指向派生类的基类指针,访问派生类中同名覆盖成员函数,也就是说派生类要实现基类中的虚函数。而且于基类中的虚函数有着不同的过程。但是在内存中如何实现的多态呢?

这里我们要说一下关于虚函数在内存中实现,首先,有一种被称为 vptr(virtual table pointer,虚函数表指针)的指针,指向一个表,vtbl(virtual table,虚函数表),表里面就是这个类的虚函数的地址。在实例化一个对象的时候,vptr和vtbl将会存到类里,也就是,如果类定义了虚函数,该类及其派生类就要生成一张虚拟函数表,即vtable。而在类的对象地址空间中存储一个该虚表的入口。当我们使用派生类调用虚函数的时候,派生类就会找到这个入口从而调用已经实现的虚函数,当我们使用基类调用虚函数的时候,基类就会找到自己的虚表的入口,然后调用自己的虚函数,这样就实现了多态。当然,虚函数的存在显得对象很“臃肿”,会损失性能,这也是虚函数实现多态的一个缺点。

纯虚函数:

许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这时纯虚函数就像是一个没有一个实现的虚函数。但是有一点不同的是,存在纯虚函数的类不能够被实例化。存在纯虚函数的类就像java中的interface,同样是作为一种规范。现在来看感觉纯虚函数的出现并没有太多的意义。试想,有些类中的函数我们真的没有办法去描述他的过程,也真的没办法实例化。比如,我们定义cat,dog,human类派生于animal类,我们可以实例化他们,但是我们如何实例化animal?这就是纯虚函数存在的原因。纯虚函数所在的类不能实例化,所以在内存中是不存在纯虚函数的,只有纯虚函数被重写成虚函数时才出现在内存中。

转载于:https://www.cnblogs.com/yujinghui/archive/2012/09/20/2695860.html

C++ 虚函数和纯虚函数相关推荐

  1. 但并不从包含函数声明的接口派生_C++的虚函数和纯虚函数

    虚函数:类成员函数前面添加virtual关键字,则该函数被称为虚函数. 纯虚函数:在虚函数的基础上,在函数末尾加上 = 0. class Animal {public: virtual void Sh ...

  2. 一口气搞懂《虚函数和纯虚函数》

    学习C++的多态性,你必然听过虚函数的概念,你必然知道有关她的种种语法,但你未必了解她为什么要那样做,未必了解她种种行为背后的所思所想.深知你不想在流于表面语法上的蜻蜓点水似是而非,今天我们就一起来揭 ...

  3. C++知识点51——虚函数与纯虚函数(下)

    接上一篇文章https://blog.csdn.net/Master_Cui/article/details/109957146 10.练习 示例 class base { public:base() ...

  4. C++ 在继承中虚函数、纯虚函数、普通函数,三者的区别

    C++ 在继承中虚函数.纯虚函数.普通函数,三者的区别 1.虚函数(impure virtual) C++的虚函数主要作用是"运行时多态",父类中提供虚函数的实现,为子类提供默认的 ...

  5. 虚函数与纯虚函数的区别

    虚函数:为了方便使用多态特性,常常需要在基类中定义虚函数. 纯虚函数: 1.原因与虚函数相同: 2.在很多情况下,基类本身生成的对象是不合理的: 虚函数与纯虚函数的区别: 1.类里声明为虚函数的话,这 ...

  6. 虚函数和纯虚函数的区别

    首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数. 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数. 定义一个函数为纯虚函数,才代表函数没有被实现. 定义纯虚函数是为了实 ...

  7. C++ 虚函数和纯虚函数的区别

    首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数. 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数. 定义一个函数为纯虚函数,才代表函数没有被实现. 定义纯虚函数是为了实 ...

  8. (转)虚函数和纯虚函数区别

    在面向对象的C++语言中,虚函数(virtual function)是一个非常重要的概念.因为它充分体现 了面向对象思想中的继承和多态性这两大特性,在C++语言里应用极广.比如在微软的MFC类库中,你 ...

  9. java中所有函数都是虚函数_关于Java:虚拟函数与纯虚函数之间的区别是什么?...

    本问题已经有最佳答案,请猛点这里访问. Possible Duplicate: C++ Virtual/Pure Virtual Explained 虚函数和纯虚函数有什么区别? CPP中的纯虚函数与 ...

  10. 虚函数和纯虚函数的区别?

    虚函数和纯虚函数的区别? 虚函数 引入原因 纯虚函数 引入原因 纯虚函数相当于接口,不能直接实例化,需要派生类来实现函数定义. 虚函数在子类里面也可以不重载的:但纯虚必须在子类去实现 一旦父类的成员函 ...

最新文章

  1. 【世界上最优秀的逆向分析工具】IDA Pro6.1绿色版
  2. 全血微量元素团标今起实施 李喜贵:两项标准填补国内外空白
  3. LeetCode 12 整数转罗马数字
  4. gsonformat插件_收藏非常有用的IDEA插件,没用过这些IDEA插件?怪不得写代码头疼
  5. 转: Div与table的区别
  6. .NET Core实战项目之CMS 第九章 设计篇-白话架构设计
  7. Spring Cloud Zuul –编写过滤器
  8. 探索JavaScript的关闭功能
  9. 利用Python中的BeautifulSoup库爬取安居客第一页信息
  10. 二值神经网络重大突破,第一次胜过MobileNet!-1与+1的三年艰苦跋涉
  11. 利用脚本启动java程序
  12. 018 HDFS中,namenode与datanode的交互
  13. 百度C2C对决淘宝的两把利器
  14. iOS APP产品流水线----- 模块化开发及组件化模块化的讨论(解耦、面向接口调用、面向页面调用、封装SDK)
  15. 贪吃蛇html游戏代码
  16. Thinkphp双轨直销系统源码
  17. lgv30刷android10,记一次LG V30系列手机完美刷入MIUI12系统和Flyme刷机教程
  18. 中文编程从入门到精通中文编程语言教学视频
  19. java excel 取消科学计数法_基于Java将Excel科学计数法解析成数字
  20. 车型识别API调用对比

热门文章

  1. Spring Data JPA 常用注解
  2. 一个自带简易数据集的模拟线性分类器matlab代码——实验训练
  3. 一个1990年代的小故事
  4. PAT练习之字符串处理
  5. python数据采集框架_20190715《Python网络数据采集》第 1 章
  6. python编程基础人民邮电出版社_Python编程基础与应用
  7. Jsoup介绍||​​​​​​​jsoup解析url || Jsoup解析字符串||​​​​​​​Jsoup解析文件
  8. es配置中防止脑裂的配置
  9. Appium 移动端自动化 - Android SDK的安装与配置,使用安卓SDK连接手机实例演示
  10. PyQt5 技术篇-设置窗口启用默认桌面位置,按屏幕比例