C++中的dynamic_cast函数

dynamic_cast 是 C++ 中的一个类型转换操作符,它主要用于处理类的层次结构中的安全向下转换(即将基类类型的指针或引用转换为派生类类型的指针或引用)。与 static_cast 不同,dynamic_cast 在运行时检查转换的安全性,如果转换不安全(即基类指针或引用实际上并不指向派生类对象),则转换会失败。

指针转换

当用于指针转换时,如果转换是安全的,dynamic_cast 会返回指向派生类对象的指针;如果转换不安全,则返回 nullptr。这使得你可以检查转换是否成功,从而避免潜在的空指针解引用错误。

class Base {public:virtual ~Base() {} // 需要虚析构函数以支持多态};class Derived : public Base {};Base* basePtr = new Derived();Derived* derivedPtr = dynamic_cast<Derived*>(basePtr); // 安全转换,derivedPtr 非 nullptrBase* anotherBasePtr = new Base();Derived* anotherDerivedPtr = dynamic_cast<Derived*>(anotherBasePtr); // 不安全转换,anotherDerivedPtr 为 nullptr

引用转换

当用于引用转换时,如果转换不安全,dynamic_cast 会抛出一个 std::bad_cast 异常,而不是返回 nullptr。因此,使用引用进行 dynamic_cast 时,通常需要配合 try-catch 语句来处理可能的异常。

try {Base& baseRef = *basePtr;Derived& derivedRef = dynamic_cast<Derived&>(baseRef); // 安全转换// 使用 derivedRef ...} catch (const std::bad_cast& e) {// 处理转换失败的情况std::cerr << "dynamic_cast failed: " << e.what() << std::endl;}try {Base& anotherBaseRef = *anotherBasePtr;Derived& anotherDerivedRef = dynamic_cast<Derived&>(anotherBaseRef); // 抛出 std::bad_cast} catch (const std::bad_cast& e) {// 处理转换失败的情况std::cerr << "dynamic_cast failed: " << e.what() << std::endl;}

 

注意事项

  • dynamic_cast 只能在包含虚函数的类(至少有一个虚函数,通常是虚析构函数)的指针或引用之间进行转换。这是因为 dynamic_cast 使用运行时类型信息(RTTI)来检查转换的安全性,而 RTTI 是通过类的虚函数表实现的。
  • 使用 dynamic_cast 进行转换时,建议总是检查转换是否成功(对于指针转换,检查是否为 nullptr;对于引用转换,使用 try-catch 语句)。
  • dynamic_cast 的性能开销通常比 static_cast 要大,因为它需要在运行时进行类型检查。因此,在性能敏感的代码中应谨慎使用。
  • 在可能的情况下,优先考虑使用设计模式(如访问者模式)或虚函数来避免在运行时进行类型检查和转换。

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

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

相关文章

R语言优雅的进行广义可加模型泊松回归分析

泊松回归&#xff08;Poisson regression&#xff09;是以结局变量为计数结果时的一种回归分析。泊松回归在我们的生活中应用非常广泛&#xff0c;例如&#xff1a;1分钟内过马路人数&#xff0c;1天内火车站的旅客流动数&#xff0c;1天内的银行取钱人数&#xff0c;一周内的销…

【已解决】如何使用母版视图统一PPT格式?

母版视图在PPT中是一个强大的工具&#xff0c;可以帮助我们统一幻灯片的格式、布局和设计风格。今天来看看如何利用母版视图统一PPT格式&#xff0c;让每张幻灯片看起来一致和专业。 第一步&#xff1a;打开母版视图 打开PPT后&#xff0c;在顶部菜单栏中&#xff0c;选择【视…

Docker容器限制内存与CPU使用

文章目录 Docker 容器限制内存与 CPU 使用内存限额内存限制命令举例使用 `nginx` 镜像学习内存分配只指定 `-m` 参数的情况CPU 限制命令举例验证资源使用Docker 容器限制内存与 CPU 使用 在生产环境中,为了保证服务器不因某一个软件导致服务器资源耗尽,我们会限制软件的资源…

【C++20】从0开始自制协程库

文章目录 参考 很多人对协程的理解就是在用户态线程把CPU对线程的调度复制了一遍&#xff0c;减少了线程的数量&#xff0c;也就是说在一个线程内完成对协程的调度&#xff0c;不需要线程切换导致上下文切换的开销。但是线程切换是CPU行为&#xff0c;就算你的程序只有一个线程…

windows服务器启动apache失败,提示请通过cmd命令行启动:net start apache

Windows Server 2012 R2服务器突然停止运行apche&#xff0c;启动apache失败&#xff0c;提示请通过cmd命令行启动:net start apache 1.报错截图&#xff1a; 进入服务里输入命令启动也不行&#xff0c;提示由于登录失败而无法启动服务。 2.问题原因&#xff1a; 服务器www用…

Node.js知识点总结

Node.js知识点总结 Node.js其本质和浏览器一样是一个JavaScript运行环境。浏览器的运行环境为V8引擎浏览器内置API&#xff08;BOM、DOM、Canvas);而node.js的运行环境是V8引擎node提供的API(fs、path、http)。它使JavaScript可以编写后端。 基本知识 fs文件系统模块 它提供一…

springboot宠物相亲平台-计算机毕业设计源码16285

目 录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2 开发环境及相关技术介绍 2.1 MySQL数据库的介绍 2.2 B/S架构的介绍 2.3 Java语言 2.4 SpringBoot框架 3 宠物相亲平台系统分析 3.1 可行性分析 3.1.1 技术可行性分析 3.1.2 经济…

基于FPGA + Qt + OpenCv的人脸考勤系统

一:界面设计 客户端界面设计: 服务端界面设计: 简介:首先服务端在注册界面先注册人脸,然后客户端界面进行人脸识别,将人脸识别的图像发送给服务端以后,服务端在图像数据库里寻找人脸比对,若有数据就将查询到的个人信息发送给客户端,并在客户端显示,查询界面是用来查…

Ribbon负载均衡与内核原理

什么是Ribbon? 目前主流的负载方案分为两种&#xff1a; 集中式负载均衡&#xff0c;在消费者和服务提供方中间使用独立的代理方式进行负载&#xff0c;有硬件的&#xff08;比如F5&#xff09;&#xff0c;也有软件的&#xff08;Nginx&#xff09;客户端根据自己的请求做负…

开放式耳机哪种性价比高?五大高口碑优质款式耳机直入!

​或许我们的日常生活中充满了噪声&#xff0c;例如马路、地铁还有公交上&#xff0c;嘈杂的声音会影响我们的心情&#xff0c;同时还会损伤我们的耳朵&#xff0c;在嘈杂的环境中&#xff0c;想听歌想煲剧了怎么办&#xff0c;又不想沉浸在自己的世界里&#xff0c;就可以使用…

rk3588s 定制版 USB adb , USB2.0与USB3.0 区别,adb 由typeC 转换到USB3.0(第二部分)

硬件资源&#xff1a; rk3588s 核心板定制的地板 软件资源&#xff1a; 网盘上的 android12 源码 1 硬件上 客户只想使用 type c 接口中的 usb2.0 OTG 。在硬件上&#xff0c;甚至连 CC芯片都没有连接。 关于一些前置的知识。 1 USB2.0 与 USB3.0 的区别。 usb3.0 兼容2.0 …

深入解析:BeanFactory与ApplicationContext的区别

文章目录 摘要1. IoC容器概述1.1 IoC容器的作用 2. BeanFactory2.1 定义和特点2.2 使用场景 3. ApplicationContext3.1 定义和特点3.2 使用场景 4. 核心区别4.1 初始化方式4.2 依赖处理4.3 应用上下文功能4.4 资源类型4.5 事务管理 5. 使用示例5.1 BeanFactory使用示例5.2 Appl…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第四十九章 平台总线总结回顾

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

EEtrade:现货黄金盈利计算方法

现货黄金交易作为一种极具吸引力的投资方式&#xff0c;其盈利计算涉及多个关键因素&#xff0c;投资者需深入理解这些因素&#xff0c;才能准确评估交易结果&#xff0c;并制定科学的投资策略。 一、现货黄金基本盈利计算&#xff1a; 利润公式&#xff1a; 利润 (收盘价 -…

深入浅出mediasoup—WebRtcTransport

mediasoup 提供了多种 transport&#xff0c;包括 WebRtcTransport、PipeTransport、DirectTransport、PlainTransport 等&#xff0c;用来实现不同目的和场景的媒体通信。WebRtcTransport 是 mediasoup 实现与 WebRTC 客户端进行媒体通信的对象&#xff0c;是 mediasoup 最重要…

DNS(域名解析协议)

1. DNS工作原理 TCP / IP提供了通过IP地址来连接到设备的功能&#xff0c;但对用户来讲&#xff0c;记住某台设备的IP地址是相当困难的&#xff0c;因此专门设计了一种字符串形式的主机命名机制&#xff0c;这些主机名与IP地址相对应。在IP地址与主机名之间需要有一种转换和查询…

如何学习Airflow:糙快猛的大数据之路(附思维导图)

什么是Airflow? 在开始之前,让我们先简单了解一下Airflow是什么。Apache Airflow是一个开源的工作流管理平台。它允许你以代码的方式定义、调度和监控复杂的数据处理管道。 想象一下,你有一系列需要按特定顺序执行的任务,而且这些任务之间还有依赖关系,Airflow就是为解决这…

SpringBoot自动配置(面试重点)

自动配置是指&#xff1a; 自动配置是指在应用程序启动时&#xff0c;SpringBoot根据classpath路径下的jar包自动配置应用程序所需的一系列bean和组件&#xff0c;从而减少开发者的配置工作&#xff0c;提高开发效率。 一&#xff1a;Condition Condition是spring4.0之后添加…

后端开发面试题6(附答案)

前言 在下首语言是golang,所以会用他作为示例。 原文参见 @arialdomartini的: Back-End Developer Interview Questions 分布式系统相关问题 1. 怎么测试一个分布式系统? 测试分布式系统是一项复杂且具有挑战性的任务,因为它涉及到多个组件在不同的网络环境和硬件设施上的…

江科大/江协科技 STM32学习笔记P8

文章目录 按键控制LED&光敏传感器控制蜂鸣器1、按键控制LED.cKey.c读取GPIO端口的库函数main.c 2、光敏传感器控制蜂鸣器Buzzer.cLightSensor.cmain.c 按键控制LED&光敏传感器控制蜂鸣器 1、按键控制 用LED.c和LED.h两个文件封装LED的驱动程序&#xff0c;LED.c存放驱…