【C++】多态 ⑪ ( 纯虚函数和抽象类 | 纯虚函数语法 | 抽象类和实现 | 代码示例 )

文章目录

  • 一、纯虚函数和抽象类
    • 1、纯虚函数
    • 2、纯虚函数语法
    • 3、抽象类和实现
  • 二、完整代码示例






一、纯虚函数和抽象类




1、纯虚函数


纯虚函数 : 在 C++ 语言中 , " 纯虚函数 " 是 特殊类型的 虚函数 , " 纯虚函数 " 在 父类 中 声明 , 但是没有实现 ;

抽象类 : " 纯虚函数 " 的 作用 是将 父类 变为 " 抽象类 " , 该类不能被实例化 , 不能创建类的实例对象 ;

继承抽象类必须实现纯虚函数 : 任何从 " 抽象类 " 派生出来的 子类 都必须提供 " 纯虚函数 " 的实现 ;


父类 中的 " 纯虚函数 " 为 其若干子类 提供了一个 公共界面 , 用于 接口的 封装 / 设计 , 软件的 模块划分 ;


2、纯虚函数语法


纯虚函数语法 :

  • 函数前 使用 virtual 关键字修饰 ;
  • 函数声明后在 括号后面为函数 赋值 0 ;
// 纯虚函数定义
virtual 返回值类型 函数名(参数列表) = 0;

纯虚函数 定义 代码示例如下 :

	// 纯虚函数  
    virtual void pureVirtualFunction() = 0;

3、抽象类和实现


" 抽象类 " 就是在类中定义了一个 " 纯虚函数 " ,

" 抽象类 " 至少包含一个纯虚函数 , 抽象类 不能 创建 实例对象 , 只能作为其它类的 父类 ;

" 纯虚函数 " 是一种在 父类 中 声明但没有实现 的虚函数 , 其目的是使 父类 成为抽象类 ;

任何从抽象类派生出来的子类都必须提供 纯虚函数 的实现 ;


" 抽象类 " 代码示例 :

// 定义了纯虚函数的类就是抽象类
class AbstractClass {  
public:  
	// 纯虚函数  
    virtual void pureVirtualFunction() = 0;
};

上述 AbstractClass 类是抽象类 , 该类不能创建实例对象 ;

  • 否则会报错 error C2259: “AbstractClass”: 无法实例化抽象类 ;

子类 继承 AbstractClass 类 , 必须 实现 virtual void pureVirtualFunction() 函数 ;


下面代码中 , DerivedClass 派生类 , 继承 AbstractClass 抽象类 , 实现了 纯虚函数 pureVirtualFunction 函数 ;

实现的 纯虚函数 可以不使用 virtual 修饰 , 在 函数声明 最后添加 override 关键字 ;

// 派生类继承抽象类
class DerivedClass : public AbstractClass {  
public:  
	// 实现纯虚函数
    void pureVirtualFunction() override {  
         // 函数体 
    }  
};




二、完整代码示例



抽象类 的 核心作用 就是 使用 抽象类类型指针 指向 子类对象 ,

使用 抽象类 指针 调用 纯虚函数 , 由于 父类 的 纯虚函数没有实现 , 实际调用的 是 子类对象的 函数 ,

该调用 发生了 多态 ;


代码示例 :

#include "iostream"
using namespace std;

// 定义了纯虚函数的类就是抽象类
class AbstractClass {
public:
	// 纯虚函数  
	virtual void pureVirtualFunction() = 0;
};

// 派生类继承抽象类
class DerivedClass : public AbstractClass {
public:
	// 实现纯虚函数
	void pureVirtualFunction() override {
		// 函数体 
		cout << "调用 DerivedClass 的 pureVirtualFunction 函数" << endl;
	}
};

int main() {

	// 抽象类不能实例化
	// error C2259: “AbstractClass”: 无法实例化抽象类
	//AbstractClass a;

	// 使用抽象类指针 指向 子类对象
	AbstractClass* p = new DerivedClass();

	// 使用抽象类指针 调用 子类对象 实现的 纯虚函数
	// 运用了 多态 原理
	p->pureVirtualFunction();


	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
}

执行结果 :

调用 DerivedClass 的 pureVirtualFunction 函数
Press any key to continue . . .

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从瀑布模式到水母模式:ChatGPT引领软件研发的革新之路

ChatGPT引领软件研发的革新之路 概述操作建议本书优势 内容简介作者简介专家推荐读者对象目录直播预告写在末尾&#xff1a; 主页传送门&#xff1a;&#x1f4c0; 传送 概述 计算机技术的发展和互联网的普及&#xff0c;使信息处理和传输变得更加高效&#xff0c;极大地改变了…

Azure 机器学习 - 使用 AutoML 和 Python 训练物体检测模型

目录 一、Azure环境准备二、计算目标设置三、试验设置四、直观呈现输入数据五、上传数据并创建 MLTable六、配置物体检测试验适用于图像任务的自动超参数扫描 (AutoMode)适用于图像任务的手动超参数扫描作业限制 七、注册和部署模型获取最佳试用版注册模型配置联机终结点创建终…

JUL 日志

JUL日志级别 日志分为7个级别&#xff0c;详细信息我们可以在Level类中查看&#xff1a; SEVERE&#xff08;最高值&#xff09;- 一般用于代表严重错误WARNING - 一般用于表示某些警告&#xff0c;但是不足以判断为错误INFO &#xff08;默认级别&#xff09; - 常规消息CON…

Hadoop HDFS(分布式文件系统)

一、Hadoop HDFS(分布式文件系统) 为什么要分布式存储数据 假设一个文件有100tb&#xff0c;我们就把文件划分为多个部分&#xff0c;放入到多个服务器 靠数量取胜&#xff0c;多台服务器组合&#xff0c;才能Hold住 数据量太大&#xff0c;单机存储能力有上限&#xff0c;需要…

QT在线安装5.15之前的版本(下载速度飞快)

使用最新的QT在线安装器&#xff0c;安装QT版本时只能安装5.15以及之后的版本&#xff0c;安装QT5.15之前的版本只能通过离线安装的方式&#xff0c;离线安装后还要自己去配置QT&#xff0c;离线安装还有个问题的&#xff0c;后续维护比较麻烦&#xff0c;QT的维护工具还要自己…

springboot2.x使用@RestControllerAdvice实现通用异常捕获

文章目录 demo地址实现效果引入基础类准备1.通用枚举与错误状态枚举2.定义通用返回结果3.自定义业务异常 统一异常捕获测试 demo地址 demo工程地址 实现效果 当我们输入1时&#xff0c;正常的返回通用的响应结果当我们输入2时&#xff0c;抛出异常&#xff0c;被捕获然后返回…

macOS 安装brew

参考链接&#xff1a; https://mirrors4.tuna.tsinghua.edu.cn/help/homebrew/ https://www.yii666.com/blog/429332.html 安装中科大源的&#xff1a; https://zhuanlan.zhihu.com/p/470873649

《TCP/IP详解 卷一:协议》第5章的IPv4数据报的Checksum(校验和)字段的计算(这里才能解开你的困惑)

首先&#xff0c;我当你看过书&#xff0c;但是比较懵。 1&#xff0c;实例说明Checksum(校验和)的计算步骤 直奔主题&#xff0c;分析一下这个Checksum&#xff08;校验和&#xff09;怎么算出来的。 先用Wireshark随便抓一个UDP或TCP包分析一下。 如上面&#xff0c;我们得…

Python数据分析:在职场中的竞争优势

前言 在职场中&#xff0c;技能的重要性是不言而喻的。越来越多的职位要求员工具备数据分析能力&#xff0c;而Python作为一种强大的数据分析工具&#xff0c;正在成为职场中的“利器”。然而&#xff0c;尽管Python数据分析提供了巨大的优势&#xff0c;许多人依然未能掌握这…

团队表 -多级团队设计

团队表 -多级团队设计 user_team团队表 &#xff0c;如果存在子团队 1.我们可以通过每一个团队字段加一个parentid &#xff08;相当于一对多的关系&#xff09; 2.还可以设置一个字段CodingNum,比如这样: //系统为了管理查询团队自动生成的有序编号 可以使用3位数代表一个…

06.Oracle数据备份与恢复

Oracle数据备份与恢复 一、通过RMAN方式备份二、使用emp/imp和expdb/impdb工具进行备份和恢复三、使用Data guard进行备份与恢复 一、通过RMAN方式备份 通过 RMAN&#xff08;Oracle 数据库备份和恢复管理器&#xff09;方式备份 Oracle 数据库&#xff0c;可以使用以下步骤&a…

【漏洞复现】74cms任意文件读取

漏洞描述 74CMS 是一款国内用的比较多招聘网站管理系统&#xff08;Job Board CMS&#xff09;&#xff0c;专注于招聘和人力资源领域的网站建设&#xff0c;存在任意文件读取漏洞 免责声明 技术文章仅供参考&#xff0c;任何个人和组织使用网络应当遵守宪法法律&#xff0c…

Temp directory ‘C:\WINDOWS\TEMP‘ does not exist

问题描述 解决方法 管理员权限问题&#xff0c;进入temp文件夹更改访问权限即可。 点击 temp文件夹 属性 -> 安全 -> 高级 -> 更改主体Users权限 给读取和写入权限 参考博客 开发springboot项目时无法启动Temp directory ‘C: \WINDOWS\TEMP‘ does not exist

K-edge 和逃逸问题

一 k-eage基本概念 1 k-edge概念 K-edge称为K边, 其物理意义是高原子序数物质原子内部K层自由电子, 易与特定能量下X射线光子发生光电吸收作用, 导致对该能量的X射线光子吸收特别大。 而K-edge特性表现为X射线与物质发生相互作用时, 其衰减系数随着能量的增加而逐渐减小, 但在…

Postgresql批量按照顺序更新某一个字段

如批量更新采购订单行sequence字段&#xff0c;按照订单行id的顺序赋值1&#xff0c;2&#xff0c;3&#xff0c;4...&#xff1a; UPDATE purchase_order_line_copy1 SET sequence subquery.new_sequence FROM (SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS new_sequence…

leetcode 117

leetcode 117 代码 #include <iostream>// Definition for a Node. class Node { public:int val;Node* left;Node* right;Node* next;Node() : val(0), left(NULL), right(NULL), next(NULL) {}Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}No…

python自动化测试模板

1:准备html模版 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>接口自动化…

天空卫士为集度智能汽车系上“安全带”

10月27日&#xff0c;集度汽车在北京正式发布了旗下首款量产车型——极越 01 SUV。极越 01 SUV 是一款集科技、智能、美学于一身的纯电动中大型SUV&#xff0c;号称全球首款“AI 汽车机器人”。作为集度的合作伙伴&#xff0c;天空卫士第一时间送上祝福&#xff0c;祝愿极越大卖…

基于LDA主题+协同过滤+矩阵分解算法的智能电影推荐系统——机器学习算法应用(含python、JavaScript工程源码)+MovieLens数据集(二)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据爬取及处理 相关其它博客工程源代码下载其它资料下载 前言 前段时间&#xff0c;博主分享过关于一篇使用协同过滤算法进行智能电影推荐系统的博文《基于TensorFlowCNN协同过滤算法的智能电影推荐系统——深…

centos7-lamp

目录 一、安装 1.关闭防火墙关闭selinux 2.安装apache 3.配置主页 二、部署mariadb&#xff08;mysql&#xff09; 1.用yum安装 2.启动数据库 3.看下端口是否listen 4登录mysql 5.修改下密码 三、安装php 1.安装依赖包 2.安装php解释器和php连接mysql驱动 3.配置…