首先:强调一个概念

定义一个函数为虚函数,不代表函数为不被实现的函数。

定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。

定义一个函数为纯虚函数,才代表函数没有被实现。

定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。

1、简介

假设我们有下面的类层次:

实例

classA{public:virtualvoidfoo(){cout<foo();// 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的!return0;}

这个例子是虚函数的一个典型应用,通过这个例子,也许你就对虚函数有了一些概念。它虚就虚在所谓"推迟联编"或者"动态联编"上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为"虚"函数。

虚函数只能借助于指针或者引用来达到多态的效果。

C++纯虚函数

一、定义

纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加 =0:

virtual void funtion1()=0

二、引入原因

1、为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。

2、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。

为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法:virtual ReturnType Function()= 0;),则编译器要求在派生类中必须予以重写以实现多态性。同时含有纯虚拟函数的类称为抽象类,它不能生成对象。这样就很好地解决了上述两个问题。

声明了纯虚函数的类是一个抽象类。所以,用户不能创建类的实例,只能创建它的派生类的实例。

纯虚函数最显著的特征是:它们必须在继承类中重新声明函数(不要后面的=0,否则该派生类也不能实例化),而且它们在抽象类中往往没有定义。

定义纯虚函数的目的在于,使派生类仅仅只是继承函数的接口。

纯虚函数的意义,让所有的类对象(主要是派生类对象)都可以执行纯虚函数的动作,但类无法为纯虚函数提供一个合理的默认实现。所以类纯虚函数的声明就是在告诉子类的设计者,"你必须提供一个纯虚函数的实现,但我不知道你会怎样实现它"。

抽象类的介绍

抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层。

(1)抽象类的定义: 称带有纯虚函数的类为抽象类。

(2)抽象类的作用:

抽象类的主要作用是将有关的操作作为结果接口组织在一个继承层次结构中,由它来为派生类提供一个公共的根,派生类将具体实现在其基类中作为接口的操作。所以派生类实际上刻画了一组子类的操作接口的通用语义,这些语义也传给子类,子类可以具体实现这些语义,也可以再将这些语义传给自己的子类。

(3)使用抽象类时注意:

抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。如果派生类中没有重新定义纯虚函数,而只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类了,它是一个可以建立对象的具体的类。抽象类是不能定义对象的。

总结:

1、纯虚函数声明如下: virtual void funtion1()=0; 纯虚函数一定没有定义,纯虚函数用来规范派生类的行为,即接口。包含纯虚函数的类是抽象类,抽象类不能定义实例,但可以声明指向实现该抽象类的具体类的指针或引用。

2、虚函数声明如下:virtual ReturnType FunctionName(Parameter) 虚函数必须实现,如果不实现,编译器将报错,错误提示为:

error LNK****: unresolved external symbol "public: virtual void __thiscall ClassName::virtualFunctionName(void)"

3、对于虚函数来说,父类和子类都有各自的版本。由多态方式调用的时候动态绑定。

4、实现了纯虚函数的子类,该纯虚函数在子类中就编程了虚函数,子类的子类即孙子类可以覆盖该虚函数,由多态方式调用的时候动态绑定。

5、虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。

6、在有动态分配堆上内存的时候,析构函数必须是虚函数,但没有必要是纯虚的。

7、友元不是成员函数,只有成员函数才可以是虚拟的,因此友元不能是虚拟函数。但可以通过让友元函数调用虚拟成员函数来解决友元的虚拟问题。

8、析构函数应当是虚函数,将调用相应对象类型的析构函数,因此,如果指针指向的是子类对象,将调用子类的析构函数,然后自动调用基类的析构函数。

有纯虚函数的类是抽象类,不能生成对象,只能派生。他派生的类的纯虚函数没有被改写,那么,它的派生类还是个抽象类。

定义纯虚函数就是为了让基类不可实例化化,因为实例化这样的抽象数据结构本身并没有意义,或者给出实现也没有意义。

实际上我个人认为纯虚函数的引入,是出于两个目的:

1、为了安全,因为避免任何需要明确但是因为不小心而导致的未知的结果,提醒子类去做应做的实现。

2、为了效率,不是程序执行的效率,而是为了编码的效率。

c语言中虚函数和纯虚函数,C++ 虚函数和纯虚函数的区别相关推荐

  1. c语言中如何区分取模和除法,除法、求余和取模的区别

    一.除法运算符"/" 二元运算符,具有左结合性.参与运算的量均为 整型时,结果为整型,舍去小数.如果运算量中有一个为实型,结果为双精度实型.例如: 5/2=2,1/2=0 5/2. ...

  2. python语言中与扩展程序功能相关的保留字_Python语言中,与函数使用相关的保留字是哪个?...

    [填空题]Complete the sentences with the words below. 1. The ________of our company was attacked yesterd ...

  3. C语言中可变参数列表

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105113526 可 ...

  4. return在c语言的意思,return在c语言中是什么意思?_后端开发

    go语言通过命令方式生成可执行文件_后端开发 在我们编写好项目后一般都需要将其编译为可执行文件,本文就来为大家介绍一下go语言通过命令方式生成可执行文件的方法. return在c语言中是什么意思? r ...

  5. c语言常考易错知识点,C语言中易错点知识点拾遗

    C语言中易错点知识点拾遗 1. 首先,feof()是文件结束检测函数,如果没有结束,返回值是 0,结束了是 1 由于 feof(fp)返回 0 才 是没有结束,所以通常写成 while(!feof(f ...

  6. c语言中虚函数和纯虚函数,虚函数和纯虚函数的区别是什么?

    虚函数和纯虚函数的区别:1.纯虚函数只有定义,没有实现:而虚函数既有定义,也有实现的代码.2.包含纯虚函数的类不能定义其对象,而包含虚函数的则可以. 相关推荐:<C++视频教程> 虚函数( ...

  7. c语言中什么函数可以作为虚函数,C++语言中的“虚函数”就像C语言中的指针,必须要弄懂的...

    上一节较为详细的讨论了C++语言中基类被派生类继承过程中的内存模型,尤其较为详细的分析了虚函数及其虚表.虚表指针在内存中是如何分布,如何存储的,这对于理解C++语言中的"动态绑定" ...

  8. c 语言中虚方法有什么作用是什么,虚函数的作用?

    定义 定义:在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数[1] 语法:virtual 函数返回类型 函数名(参数表) {函数体;} 用途:实现多态性,通过指向派生类的 ...

  9. c语言虚函数是什么,C语言中什么函数不能声明为虚函数?

    2016-07-14 00:51齐智富 客户经理 --------------------------------------------------------------------------- ...

最新文章

  1. python当前日期获取程序_Python获取当前时间日期
  2. spring MVC之返回JSON数据(Spring3.0 MVC+Jackson+AJAX)
  3. 把代码push到github所遇到的问题
  4. 第三次学JAVA再学不好就吃翔(part68)--Random类
  5. php mysql datetime时区,Django models通过DateTimeField保存到MySQL的时间的时区问题
  6. Java 8 Friday:更多功能关系转换
  7. 计算机的只读储存器,只读存储器
  8. excel重复上一步快捷键_工作再忙也要学会的十个Excel快捷键
  9. 2.1KaliLinux的安装
  10. CDN技术详解之引言
  11. 做祛痘产品微信是如何引流的?祛斑祛痘产品引流加粉渠道有哪些?
  12. 用计算机弹平凡之路谱子,pen beat曲谱_penbeat平凡之路的谱子
  13. 友芝友生物冲刺港交所上市:极其依赖单一供应商,周鹏飞为董事长
  14. 删除的备忘录怎么恢复
  15. 脑的计算模型能带我们走多远
  16. 人与机器人的交互理论及其前景
  17. 尔宾团队角色(Belbin Team Roles),亦被称为贝尔宾团队角色表(Belbin Team Inventory)
  18. PIA系列 合并式功率放大器DAVSE PIA-1080 合并式功率放大器
  19. 24核48线虚拟化服务器,24核48线程的威力:戴尔PowerEdge R910服务器评测
  20. 苹果官网对xcode版本的要求

热门文章

  1. 仿QQ空间天气预报效果 使用免费天气API的天气插件
  2. Linux 初始化root密码
  3. python 调用海康工业相机调试后出现被占用问题
  4. B2B商城网站功能板块有哪些?
  5. adb shell读取返回值_android代码执行adb shell终端命令(linux命令)并返回执行结果...
  6. 移动端测试中使用Fake Location模拟安卓手机定位-中
  7. 京东笔试编程题:采购单+保卫方案
  8. Php laravel 队列,Laravel 的队列系统介绍
  9. 30个 DotNet网站
  10. 新媒体运营怎么做?有什么技巧?