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

Android C++系列:C++最佳实践2抽象类

1. 背景

OOP面向对象程序设计的核心是数据抽象,继承和动态绑定。前面的文章我们介绍了使用virtual的虚类实现动态绑定的多态,有时候我们在做抽象时,对于抽象的实体不想让被人实例化,虚类没有这个功能,我们Java里面我们有抽象类,有接口来抽象一个实体的行为,而不允许被实例化,C++有没有这样的功能呢?C++怎么实现抽象类呢?

2. 纯虚函数

介绍抽象类之前我们先了解下纯虚函数:我们通过在函数体的位置,即在声明语句的分号之前,书写 = 0 就可以将一个虚函数说明为纯虚函数。和普通的虚函数不一样,一个纯虚函数无需定义。而且 = 0 只能出现在虚函数声明语句处:

class IBird {
public:void fly() = 0;
}

我们也可以为纯虚函数提供定义,不过函数体必须定义在类的外部,不能在类的内部为一个=0的函数提供函数体。

派生类如果定义了一个函数与基类中虚函数的名字相同但是形参列表不同,这是合法的,但是很可能不符合我们的预期。特别是在继承纯虚函数时,可能因为形参列表不匹配导致声明了新的函数,而纯虚函数没有被真正实现,怎么让编译器帮助我么实现这一点呢?

在C++11新标准中,我们可以使用override关键字来说明子类中的虚函数。如果使用override标记了某个函数,但是这个函数又没有覆盖已存在的虚函数,编译器就直接报错了。

3. 抽象基类

了解了纯虚函数后我们就可以定义抽象类了:含有纯虚函数的类是抽象基类。抽象基类负责定义接口,而后续的其他类可以覆盖这个接口。

我们不能直接创建一个抽象基类的对象,子类构造函数只初始化它的直接基类,这个和Java类似,只在子类的构造中调用super初始化直接子类。

抽象基类的设计可以替代我们Java中的接口和抽象类,如果只定义行为,就类似于Java中的接口,如果包含了数据则可以类比成Java中的抽象类。

4. 总结

通过使用数抽象,我们可以将类的接口与实现分离;使用继承,可以定义相似的类型并对其相识关系建模;使用动态绑定,可以在一定程度上忽略相识类型的区别,以统一的方式使用对象。纯虚函数是实现抽象基类的基础。本文我们介绍了纯虚函数和抽象基类,这块语法上本身比较简单,下一篇我们介绍继承时的访问控制。

相关文章:

  • Spring Boot 增删改查(mybatis-plus)
  • MSPM0G3507——PWM
  • Elasticsearch Range 查询:范围搜索
  • ARM32常见指令
  • JAVA学习笔记DAY11——Java 与 Spring框架发展
  • Scala 中的匿名函数
  • 探索数据结构:集合、线性结构、树状结构和图形结构
  • 一文搞懂Linux信号【下】
  • 【网络安全的神秘世界】关于Linux中一些好玩的字符游戏
  • C# Winform Datagridview查询项目实例
  • vcpkg安装g2o,提示找不到cs.h,debug模式运行提示找不到libcxsparse.dll
  • 注解详解系列 - @Conditional:条件化配置的利器
  • ai assistant激活成功后,如何使用
  • React的Redux的状态管理
  • 如何处理Android应用程序的内存泄漏
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 2017前端实习生面试总结
  • CSS中外联样式表代表的含义
  • download使用浅析
  • Elasticsearch 参考指南(升级前重新索引)
  • flutter的key在widget list的作用以及必要性
  • Java应用性能调优
  • js ES6 求数组的交集,并集,还有差集
  • laravel5.5 视图共享数据
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • magento 货币换算
  • orm2 中文文档 3.1 模型属性
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • spring security oauth2 password授权模式
  • Sublime Text 2/3 绑定Eclipse快捷键
  • vue2.0项目引入element-ui
  • Wamp集成环境 添加PHP的新版本
  • Webpack 4 学习01(基础配置)
  • 基于 Babel 的 npm 包最小化设置
  • 今年的LC3大会没了?
  • 前端js -- this指向总结。
  • 如何实现 font-size 的响应式
  • 设计模式走一遍---观察者模式
  • 使用 QuickBI 搭建酷炫可视化分析
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 学习ES6 变量的解构赋值
  • ​插件化DPI在商用WIFI中的价值
  • ​业务双活的数据切换思路设计(下)
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #Linux(make工具和makefile文件以及makefile语法)
  • (06)Hive——正则表达式
  • (7)svelte 教程: Props(属性)
  • (C11) 泛型表达式
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (PySpark)RDD实验实战——求商品销量排行
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (力扣题库)跳跃游戏II(c++)