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. 总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/857678.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

攻防世界-5-1

下载文件发现是一个没有尾缀的文件,扔winhex,emmmm还是没看出来 搜了一圈,发现用xortool 得到key之后,跑一下脚本 得到flag: wdflag{You Are Very Smart}

pytest测试框架pytest-sugar插件生成进度条

Pytest提供了丰富的插件来扩展其功能,介绍下插件pytest-sugar,可以帮助我们在控制台中显示彩色的测试结果和进度条,提供失败的堆栈回溯信息。 为了使用 pytest-sugar,需要满足以下条件: Python 3.8 或更高版本pytest…

并行计算之SIMD与SPMD

SIMD (Single Instruction Multiple Data) SIMD,也就是单指令多数据计算,一条指令可以处理多个数据。通过向量寄存器存储多个数据元素,并使用单条指令同时对这些数据元素进行处理,从而提高了计算效率。 代码示例: fl…

联想Y7000P 2023款拆机教程及升级内存教程

0.电脑参数介绍 联想Y7000P 2023电脑,笔者电脑CPU为i7-13700H,14核20线程;标配内存为三星的DDR5-5600MHz-8GB*2,由于电脑CPU限制,实际内存跑的频率为5200MHz; 2个内存插槽,2个固态硬盘插槽。每个内存插槽最…

FineReport报表案例

普通报表 保存的文件类型为 cpt,依靠着单元格的扩展与父子格的关系来实现模板效果,可进行参数查询,填报报表,图表设计等等,但是在分页预览模式下不能在报表主体中展示控件,而且单元格间相互影响&#xff0c…

1.2 DataX 数据同步工具详细介绍

DataX 是阿里巴巴开源的一款高效的数据同步工具,旨在实现多种异构数据源之间的高效数据同步。以下是对 DataX 的详细介绍: 架构 DataX 的架构主要包括以下几个核心组件: DataX Core:负责任务调度、插件加载、日志管理等核心功能…

IDEA 学习之 编译内存问题

目录 1. 正常的 IDEA build 日志2. 编译工具内存不足日志 (内存从小变大)2.1. 干脆无法启动2.2. Ant 任务执行报错2.3. 内存溢出:超出 GC 上限2.4. 内存溢出:超出 GC 上限,编译报错2.5. 内存溢出: 堆空间2.…

鞋子分类数据集17399张69类别

数据集类型:图像分类用,不可用于目标检测无标注文件 数据集格式:仅仅包含jpg图片,每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数):17399 分类类别数:69 类别名称:[“0”,“1”,“2”,“3”,“4”…

VisualBox 虚拟机 Ubunut 18.04 在大显示器上黑屏的问题

在小屏幕上显示没有问题,但是移动到大显示器上就黑屏了,并且不能铺满,如下所示 如果我希望它铺满整个屏幕,如何解决呢? 下面是解决方法: 虚拟机底部这个按钮,右键 产生菜单,按这个选…

09--keepalived高可用集群

前言:高可用集群配置是大型网站的一个基础,网站可用性的基础保障之一,这里将对应的概念知识和实操步骤进行整理与收集。 1、基础概念详解 1.1、高可用集群 高可用集群(High Availability Cluster,简称HA Cluster&am…

算法训练 | 动态规划Part7 | 198.打家劫舍、213.打家劫舍II、337.打家劫舍III

目录 198.打家劫舍(线性) 动态规划法 213.打家劫舍II(环形) 动态规划法 337.打家劫舍III(二叉树) 动态规划法 198.打家劫舍(线性) 题目链接:198. 打家劫舍 - 力扣&…

用友U9-UBF自定义报表-打印模板开发学习笔记

自定义报表、打印模板开发学习笔记 一、基础了解 1、UBF开发工具的了解 Ideconfig.xml配置 True:打印、报表设计模式 False:单据设计模式 2、开发环境试用 BE:实体项目 BF:操作项目 SV:服务项目 分析项目&am…

第5天:视图与模板进阶

第5天:视图与模板进阶 目标 掌握视图逻辑和模板渲染,包括不同类型的视图、自定义模板标签和过滤器,以及模板继承和包含的概念。 任务概览 学习函数视图和类视图的使用。编写自定义模板标签和过滤器。理解模板的继承和包含机制。 详细步骤…

NGINX_六 nginx 日志文件详解

六 nginx 日志文件详解 nginx 日志文件分为 **log_format** 和 **access_log** 两部分log_format 定义记录的格式,其语法格式为log_format 样式名称 样式详情配置文件中默认有log_format main $remote_addr - $remote_user [time_local] "req…

jQuery 基本操作

01-简介 jQuery 是一个功能丰富且广泛使用的 JavaScript 库,它简化了 HTML 文档遍历和操作、事件处理、动画和 Ajax 操作。jQuery 通过其易用的 API,使复杂的 JavaScript 编程任务变得更加简单,并且兼容各种浏览器。 1、jQuery特点 简化 DOM …

【Mac】Pixelmator Pro for Mac(媲美PS的修图软件)软件介绍

软件介绍 Pixelmator Pro是一款功能强大的图像编辑软件,专为macOS平台设计。它结合了丰富的图像编辑功能和直观的用户界面,适合专业摄影师、设计师以及图像编辑爱好者。以下是Pixelmator Pro的一些主要特点和功能介绍: 功能特色 非破坏性编…

MSPM0G3507——创建新的.c.h文件

在项目处点击右键,再点击New File 再命名.c.h即可

JavaWeb——MySQL:DML对表数据的修改

2.DML对表数据的修改 2.1 修改表的数据 (1) 修改单行单列 SQL语句:update 表名 set 列名1数值1 where 列名2数值2; 将sql_student表姓名为吕小布的那行,性别设置为女; (2) 修改单行多列 SQL语句:update 表名 set 列…

交易者的意义是什么?

按照阿德勒的说法:人生的意义就是为社会创造价值,推动整个人类社会的发展进步。 我认同且秉持这种观点。 而在交易中,你是否直接或者间接为社会做贡献了呢?这个还真不好说。 但是做为职业交易者,你的存在价值&#…

Elasticsearch如何聚合查询多个统计值,如何嵌套聚合?并相互引用,统计索引中某一个字段的空值率?语法是怎么样的

文章目录 Elasticsearch聚合查询说明空值率查询DSL Elasticsearch聚合基础知识扩展Elasticsearch聚合概念Script 用法Elasticsearch聚合查询语法指标聚合(Metric Aggregations)桶聚合(Bucket Aggregations)矩阵聚合(Ma…