转载自:https://www.cnblogs.com/cj2014/p/7692707.html
1.虚函数(impure virtual)
  C++的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现。
子类可以重写父类的虚函数实现子类的特殊化。
如下就是一个父类中的虚函数:

class A
{
public:virtual void out2(string s){cout<<"A(out2):"<<s<<endl;}
};

2.纯虚函数(pure virtual)

  C++中包含纯虚函数的类,被称为是“抽象类”。抽象类不能使用new出对象,只有实现了这个纯虚函数的子类才能new出对象。
  C++中的纯虚函数更像是“只提供申明,没有实现”,是对子类的约束,是“接口继承”。
  C++中的纯虚函数也是一种“运行时多态”。
  如下面的类包含纯虚函数,就是“抽象类”:

class A
{
public:virtual void out1(string s)=0;virtual void out2(string s){cout<<"A(out2):"<<s<<endl;}
};

3.普通函数(no-virtual)

  普通函数是静态编译的,没有运行时多态,只会根据指针或引用的“字面值”类对象,调用自己的普通函数。
  普通函数是父类为子类提供的“强制实现”。
  因此,在继承关系中,子类不应该重写父类的普通函数,因为函数的调用至于类对象的字面值有关。

4.程序综合实例

#include <iostream>
using namespace std;class A
{
public:virtual void out1()=0; //由子类实现:纯虚函数由子类实现virtual ~A(){};virtual void out2() //默认实现:子类可以重写函数。虚函数是为了允许用基类的指针来调用子类的函数{cout<<"A(out2)"<<endl;}void out3() //强制实现:子类不应该重写函数{cout<<"A(out3)"<<endl;}
};class B:public A
{
public:virtual ~B(){};void out1(){cout<<"B(out1)"<<endl;}void out2(){cout<<"B(out2)"<<endl;}void out3(){cout<<"B(out3)"<<endl;}//自己添加的void out4()//子类中可以有父类没有的函数{cout<<"B(out4)"<<endl;}
};
int main()
{ A *ab=new B; ab->out1(); ab->out2(); ab->out3(); cout<<"************************"<<endl; B *bb=new B; bb->out1(); bb->out2(); bb->out3(); delete ab; delete bb; return 0;
}

运行结果:

B(out1)
B(out2)
A(out3)
*****************
B(out1)
B(out2)
B(out3)

定义一个函数为虚函数,不代表函数为不被实现的函数。
定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。
定义一个函数为纯虚函数,才代表函数没有被实现。
定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数

C++中虚函数、纯虚函数、普通函数三者的区别相关推荐

  1. 面试中常被问到(11)虚函数/纯虚函数

    虚函数 如何定义一个虚函数?在基类成员函数前加入virtual关键字,但并不代表此函数不被实现,只是说明允许基类指针调用派生类重写的此函数 一个类只要声明有虚函数或者从基类继承了虚函数,在编译过程中就 ...

  2. 【C++ 语言】面向对象 ( 继承 | 重写 | 子类调用父类方法 | 静态多态 | 动态多态 | 虚函数 | 纯虚函数 )

    文章目录 类的继承 方法的重写 子类中调用父类方法 多态 虚函数 虚函数示例 纯虚函数 相关代码 类的继承 1. 继承表示 : C++ 中继承可以使用 ":" 符号 , 格式为 & ...

  3. C++ 虚函数 纯虚函数 抽象类 代码示例

    其中抽象类指的是在类的定义中出现了纯虚函数,导致无法实例化,. 代码:头文件 #include "stdafx.h"using namespace std;class Person ...

  4. 什么是纯虚函数 纯虚函数的作用 如何定义使用纯虚函数

    什么是纯虚函数 纯虚函数的作用 如何定义使用纯虚函数   一 定义: 纯虚函数是一种特殊的虚函数,它的一般格式如下:  class <类名>  {  virtual <类型>& ...

  5. C++: 虚函数 / 纯虚函数

    虚函数 ● 虚函数是指在基类内部声明的成员函数前添加关键字 virtual 指明的函数 ● 虚函数存在的意义是为了实现多态,让派生类能够重写(override)其基类的成员函数 ● 派生类重写基类的虚 ...

  6. C++:多态与虚函数,纯虚函数

    1.多态的机制与虚函数的机制 1.1 多态的机制 1.当在类中使用virtual声明一个函数为虚函数时,在编译时,编译器会自动在基类中默默地安插一个虚函数表指针,同时的.rodata段为这类生成一张虚 ...

  7. 虚函数 纯虚函数 虚基类说明

    原文:http://www.cnblogs.com/ms-frank/archive/2008/01/16/1041310.html 虚基类 在说明其作用前先看一段代码 [cpp] view plai ...

  8. 38.【C++ 虚函数 纯虚函数 虚基类 (最全详解)】

    虚函数.虚基类.纯虚函数 (一).虚函数 1.什么是虚函数: 2.虚函数的格式: 3.关于虚函数的注意事项: 4.虚函数的作用: 5.虚函数访问格式 6.虚函数的各种疑难杂症 [当指针是基类.但虚函数 ...

  9. C++多态虚函数/纯虚函数demo

    #include <iostream> using namespace std;class A //A是一个抽象类,不能new A直接实例化. { public:virtual void ...

  10. 第十三周项目三-形状类族中的纯虚函数

    /* *Copyright(c)2016,烟台大学计算机与控制工程学院 *All rights reserved *文件名称:123.cpp *作 者:王蕊 *完成日期:2016年6月1日 *版 本 ...

最新文章

  1. [Nuxt.js]Nuxt项目启动如何跳过“Are you interested in participation?”
  2. You are my brother
  3. SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession作用域(Scope)和生命周期
  4. Python Selenium + phantomJS 模拟登陆教务管理系统 “抢课”
  5. slf4j 和 log4基础入门(Maven配置)
  6. CSP认证201703-4 地铁修建[C++题解]:连通路径上的最大边权最小、bfs求边权为1的最短路、二分查找
  7. [BetterExplained]遇到问题为什么应该自己动手
  8. VTK:几何对象之OpenVROrientedArrow
  9. C++使用链表实现queue之一(附完整源码)
  10. [BZOJ 1047] [HAOI2007] 理想的正方形 【单调队列】
  11. 鼠标按下改变RelativeLayout背景颜色,松开变回
  12. free -m 释放缓冲失败
  13. html怎么样做出两列布局页面,HTML+CSS实现两栏和三栏布局
  14. 【声学基础】概述——传播
  15. 专访|从程序员到架构师:交流和分享最能让技术人进步
  16. python对象回收_python 对象引用,可变性,垃圾回收
  17. 仿layui风格漂亮easyui主题皮肤美化
  18. 域名交易的信息差,原来还可以这样赚钱
  19. 空间数据库管理方案及数据文件组织方式
  20. Full CAN与Basic CAN主要区别

热门文章

  1. PAT乙类1013 数素数 (20 分)
  2. PAT乙类之1011 A+B 和 C
  3. 美团NLP中心算法实习生内推啦!
  4. CUDA层硬件debug之路
  5. Redis系列教程(四):Redis为什么是单线程、及高并发快的3大原因详解
  6. 深度剖析RPC框架的核心设计
  7. 论文浅尝 | 基于RNN与相似矩阵CNN的知识库问答
  8. “猜心思”的Hard模式:问答系统在智能法律场景的实践与优化
  9. CNN卷积神经网络(吴恩达《卷积神经网络》笔记一)
  10. CRISP-DM:数据挖掘标准流程