C++ 动态类型转换

  1. 概念
    • 在C++中,dynamic_cast是一种运行时类型转换操作符。它主要用于在类的层次结构中进行安全的向下转换(将基类指针或引用转换为派生类指针或引用)。这种转换基于对象的实际类型进行检查,以确保转换的安全性。
  2. 使用条件
    • 为了使用dynamic_cast,类层次结构中必须包含虚函数。这是因为dynamic_cast依赖于运行时类型信息(RTTI - Runtime Type Information),而虚函数机制是C++中实现RTTI的基础。
  3. 语法示例
    • 指针类型转换
      • 假设有一个基类Base(至少包含一个虚函数)和一个派生类Derived
        class Base {virtual void someVirtualFunction() {}
        };class Derived : public Base {};int main() {Base* basePtr = new Derived();Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);if (derivedPtr!= nullptr) {// 转换成功,可以安全地使用derivedPtr指向的对象} else {// 转换失败,说明basePtr实际指向的不是Derived类型的对象}return 0;
        }
        
    • 引用类型转换
      • 同样对于上述的类层次结构:
        int main() {Base baseObj = Derived();try {Derived& derivedRef = dynamic_cast<Derived&>(baseObj);// 转换成功,可以安全地使用derivedRef引用的对象} catch (std::bad_cast& e) {// 转换失败,捕获std::bad_cast异常std::cerr << "Dynamic cast failed: " << e.what() << std::endl;}return 0;
        }
        
  4. 特点
    • 运行时检查
      • static_cast不同,dynamic_cast在运行时检查转换的有效性。这意味着它会根据对象的实际类型来判断转换是否可行。如果转换失败,对于指针类型会返回nullptr,对于引用类型会抛出std::bad_cast异常。
    • 性能开销
      • 由于dynamic_cast需要在运行时查询对象的类型信息,这会带来一定的性能开销。这种开销主要源于对虚函数表(vtable)的查询以及类型信息的判断操作。
  5. 应用场景
    • 多态性相关操作
      • 在处理多态对象时,如果需要根据对象的实际派生类型进行特定操作,dynamic_cast就非常有用。例如,在一个图形绘制系统中,有一个基类Shape,派生类有CircleRectangle等。当处理一个Shape指针数组时,可以使用dynamic_cast来确定每个元素实际指向的派生类对象,从而调用相应的派生类特定绘制函数。
    • 避免不安全的向下转换
      • 在类层次结构中,如果不确定基类指针或引用实际指向的对象类型,直接进行向下转换是不安全的。dynamic_cast提供了一种安全的方式来进行这种转换,通过运行时检查避免了对不适当对象进行错误的操作。

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

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

相关文章

校园食堂明厨亮灶监控分析系统

校园食堂明厨亮灶监控分析系统通过yolov5网络模型技术,校园食堂明厨亮灶监控分析系统针对校园餐厅后厨厨师穿戴及行为进行7*24小时不间断实时分析预警,如:不按要求戴口罩、不穿厨师帽、陌生人员进入后厨、厨师不穿厨师服、上班时间玩手机、老鼠识别等行为。校园食堂明厨亮灶…

工服智能监测预警系统

工服智能监测预警系统通过yolov8网络模型算法,工服智能监测预警系统对摄像机画面内出现的人员着装穿戴实时监测,当检测到现场人员未按要求穿戴工服工装则输出报警信息,通知后台值班人员及时处理。工服智能监测预警系统无需新增硬件,利用最新的深度学习技术,基于现场监控视…

ai皮带跑偏撕裂监测系统功能

ai皮带跑偏撕裂监测系统功能基于人工智能视觉技术,ai皮带跑偏撕裂监测系统功能自动识别现场监控画面中传送皮带撕裂、跑偏、偏移等情况,当ai皮带跑偏撕裂监测系统功能检测出皮带出现撕裂或者跑偏现象后,立即告警抓拍存档同步回传后台提醒及时处理,提高煤矿的智能化水平和人…

订单交易平台一

简介:订单交易平台核心的功能模块:认证模块,用户名密码 或 手机短信登录(60s有效)。角色管理,不同角色具有不同权限 和 展示不同菜单。 管理员,充值客户,下单客户管理,除了基本的增删改查以外,支持对客户可以分级,不同级别后续下单折扣不同。交易中心管理员可以给客…

学习“基于VirtualBox虚拟机安装Ubuntu图文教程”

安装过程中出现了很多问题第一次安装没有下载ubtun20.04 镜像 第二次安装不知道如何下载bzip2,导致一直安装增强功能 第三次在上B站搜索视频讲解后成功安装好了

wintools premium 24.10.1 注册分析

wintools premium 24.10.1 目录wintools premium 24.10.1NAGSCREEN_proc_472350check_472BF0pyps win32 程序,程序注册逻辑简单,关注窗口事件、控件id可快速定位到关键逻辑。 NAGSCREEN_proc_472350 INT_PTR __thiscall NAGSCREEN_proc_472350(void *this, HWND hDlg, UINT a…

项目部署二:服务器和环境配置

2.服务和环境配置 下面的配置和操作均在腾讯云服务器+CentOS 7.5的系统下进行。 2.1 MySQL安装服务端 yum install mariadb-server -y mariadb-server.x86_64 1:5.5.68-1.el7安装客户端 yum install mariadb -y 软件包 1:mariadb-5.5.68-1.el7.x86_64 已安装并且是最新版本服务…

freeRTOS源码解析4--tasks.c 7

4.2.20 空闲任务调用1--prvCheckTasksWaitingTermination 删除所有终止的任务, 释放资源。简单描述就是清空xTasksWaitingTermination列表,释放资源,递减uxCurrentNumberOfTasks和uxDeletedTasksWaitingCleanUp。接口:static void prvCheckTasksWaitingTermination( void )接…

软件工程师课程辅导

Day1 环境搭建下载vscode下载链接:https://pan.baidu.com/s/1Oo1TIrAKmlEuEfdn9EXgLQ?pwd=nkt9配置vscode的python开发环境教程:https://www.runoob.com/python3/python-vscode-setup.html安装Pycharm下载教程:https://blog.csdn.net/qq_44809707/article/details/12250111…

PAIRDISTILL: 用于密集检索的成对相关性蒸馏方法

在当今海量数据时代,有效的信息检索(IR)技术对于从庞大数据集中提取相关信息至关重要。近年来,密集检索技术展现出了相比传统稀疏检索方法更加显著的效果。 现有的方法主要从点式重排序器中蒸馏知识,这些重排序器为文档分配绝对相关性分数,因此在进行比较时面临不一致性的挑战。…

School New Competition WP

试验一下博客园的基础功能,顺便把学校战队招新赛的Wp传一下, alpaca_search: 直接burp爆破把密码搞出来,在burp多抓几次包会在正确的包里发现一个新的cookie名count,count记录了正确的值 ,然后把它改成999再多发几次包,发到正确的那一个后就拿到了flag RCE_ME!!! 题目直…

pytorch环境安装

pytorch环境安装 1.基础安装 首先安装anaconda打开,进入base,输入命令,这里-n后跟的是环境名字,再往后是python版本,不要太高 conda create -n pytorch python=3.8安装的时候有按y的就按y 创建成功后使用下面命令进入创建的环境 conda activate pytorch2.安装需要的库 pip…