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

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中的多态根据实际的对象类型调用对应的函数 &#xff08;1&#xff09;可以在基类中定义虚函数返回具体的类型信息 &#xff08;2&#xff09;所有的派生类都必须实现类型相关的虚函数 &#xff08;3&#xff09;每个类中的类型虚函数都需…...

雷电模拟器安卓7以上+Charles抓包APP最新教程

一、工具准备&#xff1a; 证书安装工具全局代理工具下载&#xff1a; https://download.csdn.net/download/weixin_51111267/87536481 二、Charles设置 &#xff08;一&#xff09;电脑上证书安装 &#xff08;二&#xff09;安卓模拟器上系统证书安装&#xff08;RooT权限打…...

vsvode 配置sftp,连接远程linux全过程

在本地安装sftp插件&#xff0c;配置参数https://blog.csdn.net/u011119817/article/details/106630599在linux机台安装vscode-service服务https://zhuanlan.zhihu.com/p/294933020连接超时&#xff0c;将配置文件添加超时时间遇到的错误处理&#xff1a;(272条消息) 【vscode插…...

C++类转换为蓝图、打印日志、蓝图关卡、删除C++文件

蓝图宏 UCLASS(Blueprintable)//c脚本可转换为蓝图 UPROPERTY(BlueprintReadWrite)//蓝图中可创建set&#xff0c;get节点 UFUNCTION(BlueprintCallable)//可创建函数节点 UPROPERTY(BlueprintReadWrite,Category”My Variables”)//节点进行分类打印日志 UE_LOG(LogTemp, Lo…...

elasticsearch高级篇:核心概念和实现原理

1.elasticsearch核心概念1.1 索引(index)一个索引就是一个拥有几分相似特征的文档的集合。比如说&#xff0c;你可以有一个客户数据的索引&#xff0c;另一个产品目录的索引&#xff0c;还有一个订单数据的索引。一个索引由一个名字来标识&#xff08;必须全部是小写字母&#…...

部署安装Nginx服务实例

其他服务&#xff1a; 搭建zabbix4.0监控服务实例 普罗米修斯监控mysql数据库实战 Linux安装MySQL数据库步骤 一. Nginx概念介绍 1.介绍Nginx程序 Nginx (engine x) 是一款开源且高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。主要特点是占用…...

云原生架构设计原则及典型技术

云原生是面向云应用设计的一种思想理念&#xff0c;充分发挥云效能的最佳实践路径&#xff0c;帮助企业构建弹性可靠、松耦合、易管理可观测的应用系统&#xff0c;提升交付效率&#xff0c;降低运维复杂度。代表技术包括不可变基础设施、服务网格、声明式 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)的方式进行的&#xff0c;JDK提供各种各样的“流”类&#xff0c;以获取不同类型的数据。可以理解为将管道插入到文件中&#xff0c;然后从管道获取数据。这个管道外边还可以套管道&#xff0c;外边的管道对数据进行处理…...

打破原来软件开发模式的无代码开发平台

前言传统的系统开发是需要大量的时间和成本的&#xff0c;如今无代码开发平台的出现就改变了这种状况。那么你知道什么是无代码开发平台?无代码开发对企业来说有什么特殊的优势么?什么是无代码平台无代码平台指的是&#xff1a;使用者无需懂代码或手写代码&#xff0c;只需通…...

06-redux中的hook

知识点06-redux的hook 在函数组件中要和redux连接&#xff0c;分为两个步骤 前提状态机已经主备就绪 注入store到根组件 在函数组件中&#xff0c;使用Provider包裹根组件&#xff0c;并将store注入这一步&#xff0c;依旧是不能少的 import store from "./redux/store…...

watch监听不到数组对象的变化

watch监听不到数组对象的变化一、利用索引直接改变arr的值二、修改数组的长度arr.length三、添加和修改对象属性和值Vue不能监听到数组和对象值的变化其实和双向绑定的原理有关。Vue双向绑定原理是利用js中的Object.defineproperty重定义对象的GET和SET方法&#xff0c;而同时这…...

言语理解与表达之语句表达

考点一语句填空提问方式&#xff1a;填入划横线处最恰当的一句是&#xff08; &#xff09;1.横线在结尾&#xff1a;总结前文提出对策2.横线在开头&#xff1a;需概括文段的中心内容3.横线在中间&#xff1a;注意与上下文联系把握好主题词&#xff0c;保证文段话题一致实例1和…...

2023年全国最新食品安全管理员精选真题及答案14

百分百题库提供食品安全管理员考试试题、食品安全员考试预测题、食品安全管理员考试真题、食品安全员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 131.食品生产企业在一年内&#xff08;&#xff09;次因违反《中华人民共…...

【MySQL】约束

文章目录1. 约束2. 非空约束 NOT NULL3. 唯一性约束 UNIQUE4. 主键约束 PRIMARY KEY5. 自增约束 AUTO_INCREMENT6. 外键约束FOREIGN KEY7. 默认值约束 DEFAULT8. 小结1. 约束 为了保证数据的完整性&#xff0c;SQL规范以约束的方式对表数据进行额外的条件限制。从以下四个方面…...

C语言学习(三)

#include <stdio.h> int main(void){int a; scanf("%d",&a); printf("%d",a); return 0&#xff1b;} 正在上传…重新上传取消正在上传…重新上传取消&符号作用是把键盘中输入的值给变量a,使用scanf()时输入数值&#xff0c;需要按一下enter…...

TOUGH系列软件建模及在地下水、CO2地质封存、水文地球化学、地热等多相多组分系统多过程耦合

TOUGH2系列软件传统地下水模拟软件Feflow和Modflow不同&#xff0c;TOUGH2系列软件采用模块化设计和有限积分差网格剖分方法&#xff0c;通过配合不同EOS模块&#xff0c;软件可以处理各种复杂地质条件下&#xff0c;诸如地热能开发&#xff0c;非饱和带水气运移、油气运移&…...

k8s学习之路 | k8s 工作负载 ReplicaSet

文章目录1. ReplicaSet 基础概念1.1 RS 是什么&#xff1f;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实现半色调技术图像转换

半色调技术 半色调技术是一种将灰度图像转换为黑白图像的技术。它是通过将灰度图像的像素值映射到黑白像素值上来实现的。 比如说&#xff0c;在一块只能显示纯黑或纯白的屏幕上&#xff0c;如何将一张灰度图显示出灰度的效果&#xff0c;这时就可以用半色调技术实现。 如下…...

c++面试技巧-基础篇

1.面试官&#xff1a;简述C语言的优缺点。 应聘者&#xff1a;C语言的优缺点如下。 • C语言的优点&#xff1a;C语言既保留了C语言的有效性、灵活性、便于移植等全部精华和特点&#xff0c;又添加了面向对象编程的支持&#xff0c;具有强大的编程功能&#xff0c;可方便地构…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...