C++回顾(十一)—— 动态类型识别和抽象类
11.1 动态类识别
11.1.1 自定义类型
-
C++中的多态根据实际的对象类型调用对应的函数
(1)可以在基类中定义虚函数返回具体的类型信息
(2)所有的派生类都必须实现类型相关的虚函数
(3)每个类中的类型虚函数都需要不同的实现

-
使用虚函数进行动态类型识别的缺陷
(1)必须从基类开始提供类型虚函数
(2)所有派生类都必须重写类型虚函数
(3)每个派生类的ID必须唯一
示例代码:
#include <iostream>using namespace std;class Parent
{
private:int a;
public:enum {ID = 0};virtual int getID(){return ID; }
};class Child : public Parent
{
public:enum {ID = 1};int array[102400];virtual int getID(){return ID;}};void f(Parent *p)
{//Child *c = (Child *)p; //派生类指针指向基类对象 //如果指针指向派生类对象,可以转换,指向基类对象,不能转换if (p->getID() == Child::ID) //如果成立,说明指向派生类对象{Child *c = (Child *)p;c->array[102400 - 1] = 100;}else{cout << "不能转换" << endl;}
}int main()
{//Parent *p = new Child;Parent *p = new Parent;f(p);return 0;
}
运行结果:

11.1.2 dynamic_cast
-
新的关键字 dynamic_cast
(1)dynamic_cast是C++中的新型关键字
(2)dynamic_cast用于基类和派生类之间的转换
(3)dynamic_cast要求使用的目标类型是多态的
即要求所在类族至少有一个虚函数
用于指针转换时,转换失败返回空指针
用于引用转换时,转换失败将引发bad_cast异常 -
dynamic_cast的优势
(1)不用显示的声明和定义虚函数
(2)不用为类族中的每个类分配类型ID -
dynamic_cast的缺陷
只能用于有虚函数的类族

示例代码:
#include <iostream>using namespace std;class Parent
{
private:int a;
public:virtual void show(){}
};class Child : public Parent
{
public:int array[102400];void show(){}
};void f(Parent *p)
{Child *c = dynamic_cast<Child *>(p); //如果p指向的是基类对象,则转换失败,转换失败返回NULLif (NULL == c){cout << "转换失败" << endl;}else{cout << "转换成功" << endl;c->array[102400 - 1] = 100;}
}int main()
{//Parent *p = new Child;Parent *p = new Parent;f(p);return 0;
}
运行结果:

11.1.3 typeid
- C++提供了typeid关键字用于动态获取类型信息
(1)typeid关键字返回对应参数的类型信息
(2)typeid关键字返回一个type_info类对象,当typeid参数为NULL时,抛出bad_typeid异常
(3)type_info类的使用需要包含typeinfo头文件 - typeid的使用


示例代码:
#include <iostream>
#include <typeinfo>using namespace std;class Parent
{
private:int a;
public:virtual void show(){}
};class Child : public Parent
{
public:int array[102400];
public:void show(){}
};void f(Parent *p)
{if (typeid(*p) == typeid(Child)){cout << "可以转换" << endl;Child *c = (Child *)p; //派生类指针指向基类对象c->array[102400 - 1] = 100;}else if (typeid(*p) == typeid(Parent)){cout << "不能转换" << endl;}
}int main()
{int a;char ch;Parent p1;Child c1;const type_info &pa = typeid(a); const type_info &pch = typeid(ch); const type_info &pp1 = typeid(p1); const type_info &pc1 = typeid(c1); cout << pa.name() << endl;cout << pch.name() << endl;cout << pp1.name() << endl;cout << pc1.name() << endl;//if (pa.name() == i) // 不同编译器可以不一样(不能这么写)Parent *p = new Parent;//Parent *p = new Child;f(p);return 0;
}
运行结果:

11.2 纯虚函数和抽象类
11.2.1 基本概念

- 抽象类
(1)含有纯虚函数的类;
(2)抽象类不能用于直接创建对象实例,可以声明抽象类的指针和引用
(3)可使用指向抽象类的指针支持运行时多态性
(4)派生类中必须实现基类中的纯虚函数,否则它仍将被看作一个抽象类

示例代码:
#include <iostream>using namespace std;class Parent //含有纯虚函数的类称为抽象类 抽象类不能创建对象
{
public:void show(){cout << "this is parent" << endl;}virtual void print() = 0; //纯虚函数 没有函数体
};class Child : public Parent
{
public:void print(){cout << "this is Child" << endl;}
};int main()
{//Parent pp;//pp.print();Parent *p = new Child;p->print();return 0;
}
运行结果:

相关文章:
C++回顾(十一)—— 动态类型识别和抽象类
11.1 动态类识别 11.1.1 自定义类型 C中的多态根据实际的对象类型调用对应的函数 (1)可以在基类中定义虚函数返回具体的类型信息 (2)所有的派生类都必须实现类型相关的虚函数 (3)每个类中的类型虚函数都需…...
雷电模拟器安卓7以上+Charles抓包APP最新教程
一、工具准备: 证书安装工具全局代理工具下载: https://download.csdn.net/download/weixin_51111267/87536481 二、Charles设置 (一)电脑上证书安装 (二)安卓模拟器上系统证书安装(RooT权限打…...
vsvode 配置sftp,连接远程linux全过程
在本地安装sftp插件,配置参数https://blog.csdn.net/u011119817/article/details/106630599在linux机台安装vscode-service服务https://zhuanlan.zhihu.com/p/294933020连接超时,将配置文件添加超时时间遇到的错误处理:(272条消息) 【vscode插…...
C++类转换为蓝图、打印日志、蓝图关卡、删除C++文件
蓝图宏 UCLASS(Blueprintable)//c脚本可转换为蓝图 UPROPERTY(BlueprintReadWrite)//蓝图中可创建set,get节点 UFUNCTION(BlueprintCallable)//可创建函数节点 UPROPERTY(BlueprintReadWrite,Category”My Variables”)//节点进行分类打印日志 UE_LOG(LogTemp, Lo…...
elasticsearch高级篇:核心概念和实现原理
1.elasticsearch核心概念1.1 索引(index)一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母&#…...
部署安装Nginx服务实例
其他服务: 搭建zabbix4.0监控服务实例 普罗米修斯监控mysql数据库实战 Linux安装MySQL数据库步骤 一. Nginx概念介绍 1.介绍Nginx程序 Nginx (engine x) 是一款开源且高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。主要特点是占用…...
云原生架构设计原则及典型技术
云原生是面向云应用设计的一种思想理念,充分发挥云效能的最佳实践路径,帮助企业构建弹性可靠、松耦合、易管理可观测的应用系统,提升交付效率,降低运维复杂度。代表技术包括不可变基础设施、服务网格、声明式 API 及 Serverless 等…...
【Linux】-- 工具介绍 vim_gcc/g++_gdb
目录 Linux中的软件管理工具 – yum 在Linux下安装软件的方式 认识yum 查找软件包 安装 卸载 lrzsz.x86_64 rz sz Linux中的编辑器 – vim vim的基本概念 vim各模式切换 vim命令模式命令 vim底行模式命令 gcc / g gcc / g的作用 gcc / g语法 预处理 编译 汇…...
JAVA SE: IO流
一、Java流式输入输出原理Java对于输入输出是以流(Stream)的方式进行的,JDK提供各种各样的“流”类,以获取不同类型的数据。可以理解为将管道插入到文件中,然后从管道获取数据。这个管道外边还可以套管道,外边的管道对数据进行处理…...
打破原来软件开发模式的无代码开发平台
前言传统的系统开发是需要大量的时间和成本的,如今无代码开发平台的出现就改变了这种状况。那么你知道什么是无代码开发平台?无代码开发对企业来说有什么特殊的优势么?什么是无代码平台无代码平台指的是:使用者无需懂代码或手写代码,只需通…...
06-redux中的hook
知识点06-redux的hook 在函数组件中要和redux连接,分为两个步骤 前提状态机已经主备就绪 注入store到根组件 在函数组件中,使用Provider包裹根组件,并将store注入这一步,依旧是不能少的 import store from "./redux/store…...
watch监听不到数组对象的变化
watch监听不到数组对象的变化一、利用索引直接改变arr的值二、修改数组的长度arr.length三、添加和修改对象属性和值Vue不能监听到数组和对象值的变化其实和双向绑定的原理有关。Vue双向绑定原理是利用js中的Object.defineproperty重定义对象的GET和SET方法,而同时这…...
言语理解与表达之语句表达
考点一语句填空提问方式:填入划横线处最恰当的一句是( )1.横线在结尾:总结前文提出对策2.横线在开头:需概括文段的中心内容3.横线在中间:注意与上下文联系把握好主题词,保证文段话题一致实例1和…...
2023年全国最新食品安全管理员精选真题及答案14
百分百题库提供食品安全管理员考试试题、食品安全员考试预测题、食品安全管理员考试真题、食品安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 131.食品生产企业在一年内()次因违反《中华人民共…...
【MySQL】约束
文章目录1. 约束2. 非空约束 NOT NULL3. 唯一性约束 UNIQUE4. 主键约束 PRIMARY KEY5. 自增约束 AUTO_INCREMENT6. 外键约束FOREIGN KEY7. 默认值约束 DEFAULT8. 小结1. 约束 为了保证数据的完整性,SQL规范以约束的方式对表数据进行额外的条件限制。从以下四个方面…...
C语言学习(三)
#include <stdio.h> int main(void){int a; scanf("%d",&a); printf("%d",a); return 0;} 正在上传…重新上传取消正在上传…重新上传取消&符号作用是把键盘中输入的值给变量a,使用scanf()时输入数值,需要按一下enter…...
TOUGH系列软件建模及在地下水、CO2地质封存、水文地球化学、地热等多相多组分系统多过程耦合
TOUGH2系列软件传统地下水模拟软件Feflow和Modflow不同,TOUGH2系列软件采用模块化设计和有限积分差网格剖分方法,通过配合不同EOS模块,软件可以处理各种复杂地质条件下,诸如地热能开发,非饱和带水气运移、油气运移&…...
k8s学习之路 | k8s 工作负载 ReplicaSet
文章目录1. ReplicaSet 基础概念1.1 RS 是什么?1.2 RS 工作原理1.3 什么时候使用 RS1.4 RS 示例1.5 非模板 Pod 的获得1.6 编写 RS1.7 使用 RS1.8 RS 替代方案2. ReplicaSet 与 ReplicationController2.1 关于 RS、RC2.2 两者的选择器区别2.3 总结1. ReplicaSet 基础…...
python实现半色调技术图像转换
半色调技术 半色调技术是一种将灰度图像转换为黑白图像的技术。它是通过将灰度图像的像素值映射到黑白像素值上来实现的。 比如说,在一块只能显示纯黑或纯白的屏幕上,如何将一张灰度图显示出灰度的效果,这时就可以用半色调技术实现。 如下…...
c++面试技巧-基础篇
1.面试官:简述C语言的优缺点。 应聘者:C语言的优缺点如下。 • C语言的优点:C语言既保留了C语言的有效性、灵活性、便于移植等全部精华和特点,又添加了面向对象编程的支持,具有强大的编程功能,可方便地构…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
高考志愿填报管理系统---开发介绍
高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发,采用现代化的Web技术,为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## 📋 系统概述 ### 🎯 系统定…...
