C++之纯虚函数与抽象类

  • 什么是纯虚函数?
  • 什么是抽象类

什么是纯虚函数?

纯虚函数是将基类中的函数声明为虚函数=0的函数。纯虚函数只能声明,不能定义,因为纯虚函数没有函数体。纯虚函数的写法为 virtual 函数返回类型 函数名(参数列表)=0;其中 =0 并不是将函数赋值为0,而是告知编译器这是纯虚函数。

什么是抽象类

包含纯虚函数的类称为抽象类,一般都是将基类写成抽象类,由于纯虚函数没有函数体,因此无法定义,不能被调用,系统也就无法为其分配内存,所以抽象类不能实例化对象。基类中的纯虚函数可以由派生类去实现,但是需要派生类将基类中的纯虚函数全部实现,否则派生类将无法实例化。(假如基类中有两个纯虚函数,派生类只实现了一个,那么将无法实例化)

#include <iostream>
#include <thread>using namespace std;class People {public:People(int b);virtual ~People();virtual void run() = 0;virtual int swim(int a) = 0;private:int b;
};People::People(int b) : b(b) { cout << "People constructed is created" << endl; }People::~People() { cout << "People destructed is used" << endl; }class SonPeople : public People {public:SonPeople(int b, int c);~SonPeople();int swim(int a);void run();private:int c;
};SonPeople::SonPeople(int b, int c) : People(b), c(c) {cout << "SonPeople constructed is created" << endl;
}SonPeople::~SonPeople() { cout << "SonPeople destructed is used" << endl; }int SonPeople::swim(int a) { return 0; }void SonPeople::run() { cout << "this is run function" << endl; }int main() {People *ptr = new SonPeople(2, 3);int swim = ptr->swim(3);cout << "ptr->swim():" << swim << endl;ptr->run();delete ptr;return 0;
}
输出:
People constructed is created
SonPeople constructed is created
ptr->swim():0
this is run function
SonPeople destructed is used
People destructed is used

在实际开发中,你可以定义一个抽象基类,只完成部分功能,未完成的功能交给派生类去实现(谁派生谁实现)。这部分未完成的功能,往往是基类不需要的,或者在基类中无法实现的。虽然抽象基类没有完成,但是却强制要求派生类完成,这就是抽象基类的“霸王条款”。
抽象基类除了约束派生类的功能,还可以实现多态。上述程序中基类指针 ptr 的类型是People,但是它却可以访问派生类中的 swim() 和 run() 函数,这是由于在 People 类中将这两个函数定义为纯虚函数,实现了多态。这或许才是C++提供纯虚函数的主要目的。
关于纯虚函数的几点说明
1.一个纯虚函数就可以使类成为抽象基类,但是抽象基类中除了包含纯虚函数外,还可以包含其它的成员函数(虚函数或普通函数)和成员变量。
2.只有类中的虚函数才能被声明为纯虚函数,普通成员函数和顶层函数均不能声明为纯虚函数

C++之纯虚函数与抽象类相关推荐

  1. c++ 纯虚函数和抽象类那些事(一)

    1.纯虚函数与抽象类 C++中的纯虚函数(或抽象函数)是我们没有实现的虚函数!我们只需声明它!通过声明中赋值0来声明纯虚函数! 纯虚函数:没有函数体的虚函数 抽象类:包含纯虚函数的类 /*** @br ...

  2. C++纯虚函数和抽象类

    基本概念 纯虚函数和抽象类 纯虚函数是一个在基类中说明的虚函数,但是在基类中没有定义,要求任何派生类都定义自己的版本 纯虚函数为个派生类提供一个公共界面(接口的封装和设计.软件模块功能的划分) 纯虚函 ...

  3. C++基本概念复习之二:多重继承、虚继承、纯虚函数(抽象类)

    一.多重继承: #include <iostream> using namespace std; class Horse { public: Horse(){cout<<&qu ...

  4. C++之纯虚函数和抽象类

    纯虚函数和抽象类 1.基本概念 2.案例 #include <iostream> using namespace std;////面向抽象类编程(面向一套预先定义好的接口编程)//解耦合 ...

  5. C++纯虚函数与抽象类

    纯虚函数 1.1纯虚函数是在声明虚函数时被"初始化"为0的函数.声明纯虚函数的一般形式为: virtual 函数类型 函数名 (参数列表) =0; 如 virtual float ...

  6. 9-2:C++多态之纯虚函数和抽象类以及接口继承和实现继承

    文章目录 (1)纯虚函数和抽象类的概念 (2)抽象类的意义 (3)接口继承与实现继承 (1)纯虚函数和抽象类的概念 如果一个类的虚函数后面写上=0,同时不写它的实现,那么这样的虚函数称之为纯虚函数,包 ...

  7. C++ 虚函数,纯虚函数,抽象类整理

    抽象类,类中包含纯虚函数的为抽象类,其中抽象类的子类必须实现抽象类的纯虚函数方法. 抽象类无法实例化 虚函数,子类可以实现或者不实现该方法都可以 如果父类调用子类的基类指针时,有虚函数的则使用子类的实 ...

  8. c/c++入门教程 - 2.4.7 多态、函数地址晚绑定(重写,虚函数,纯虚函数,抽象类,虚析构,纯虚析构)

    目录 4.7 多态 4.7.1 多态的基本概念(超级重要) 4.7.2 多态的原理刨析(超级重要) 4.7.2 多态案例一:计算器类 4.7.3 纯虚函数和抽象类 4.7.4 多态案例二 - 制作饮品 ...

  9. C++ 纯虚函数与抽象类

    1.虚函数 1.1 虚函数简介 可以毫不夸张地说虚函数是C++最重要的特性之一,我们先来看一看虚函数的概念. 在基类的定义中,定义虚函数的一般形式为: virtual 函数返回值类型 虚函数名(形参表 ...

  10. cc32a_demo-32dk2j_cpp_纯虚函数与抽象类-txwtech

    //32dk2j_cpp_纯虚函数与抽象类cc32a_demo-txwtech //纯虚函数是用来继承用的 //纯虚函数 //抽象类-抽象数据类型 //*任何包含一个或者多个纯虚函数的类都是抽象类 / ...

最新文章

  1. nodejs mysql 异步_Gearman + Nodejs + MySQL UDF异步实现 MySQL 到 Redis 的数据同步
  2. 服务器标记“asp:ScriptManager”不明确。
  3. java 问题排查_JAVA问题排查笔记
  4. python生成树状图_python 生成 树状结构
  5. java selenium用js点击_Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?...
  6. [数据库]-----记一次mysql分库的操作(冷热分离)
  7. 条码php api,条码生成识别
  8. java一次性查询几十万,几百万数据解决办法
  9. python3读取网页内容_python3获取一个网页特定内容
  10. 【缺陷检测】基于matlab GUI计算机视觉缺陷检测系统【含Matlab源码 1845期】
  11. Kafka 面试题(2022)
  12. 产品经理面试常见问题及答案参考总结(一)
  13. Gateway网关- 微服务(十四)
  14. 「软件架构」InfoQ 软件架构和设计趋势报告2020年4月
  15. 近期一些我寨采用的新芯片资料汇总(更新Rk3066)
  16. 软考——计算机基础知识总结
  17. OpenHarmony恢复启动子系统init进程之服务管理与发布
  18. python清掉内存的函数_关于python:如何彻底清除所有Matplotlib图的内存
  19. Oracle数据库----------------索引
  20. Metasploit(超详细)命令

热门文章

  1. 深富策略:北交所首秀抢眼 沪深指数微跌
  2. 微信小程序之使用echarts图表展示OneNet温度数据(附小程序源码)2022-11-20
  3. English learning method ---反述式口语练习法
  4. android实验报告指导书,虚拟现实技术实验报告指导书.doc
  5. 100大最佳古怪网站
  6. 快速拿捏CSS中的常用的元素属性
  7. matplotlib横向条形图(barh、get_width、get_y)
  8. python使用xmindparser解析xmind文件并统计测试案例个数
  9. Excel_项目节点对比图表
  10. ajax获取json数据解析为undefined