C++ dynamic_cast的使用

dynamic_cast介绍 首先说到c++常用的四中转换类型,我们都很清楚,分别是下面四中   1 const_cast  const_cast<目标类型>(标识符):目标类型只能是指针或者引用2 static_cast 类似C风格的强制转换,进行无条件转换,静态类型转换: 1)基类和子类之间的转换:其中子类指针转换为父类指针是安全的,但父类指针转换为子类指针是不安全的(基类和子类之间的动态类型转换建议用dynamic_cast)。 2)基本数据类型转换,enum,struct,int,cha... 阅读详情
AI摘要

本文深入探讨了C++11中dynamic_cast操作符的使用,包括其语法、工作原理及在不同类型转换中的应用。通过实例代码,展示了如何安全地进行基类到派生类的转换,并讨论了dynamic_cast的效率问题及其在设计模式中的角色。

C++11中引入了一些新的类型转换操作符,我们来看看dynamic_cast的使用。
首先,让我们考虑一下:在什么场景下我们希望使用dynamic_cast呢?

#include <iostream>

class Base
{
public:
	virtual void print()
	{
		std::cout << "Base print" << std::endl;
	}

	void work()
	{
		std::cout << "Base do work..." << std::endl;
	}
};

class Derived : public Base
{
public:
	virtual void print()
	{
		std::cout << "Derived print!" << std::endl;
	}
	void work()
	{
		std::cout << "Derived do work..." << std::endl;
	}
};

int main()
{
	Base* pBase = new Derived();
	pBase->print();
	pBase->work();
	
	getchar();
	return 0;
}

运行结果:

Derived print!
Base do work...

分析结果:print()是虚函数,在运行时的类型来决定运行结果;而work()函数不是虚函数,只是类的普通成员函数,在编译期间决定。所以调用的Base::work()函数。

如果我们希望通过指针调用Derived::work(),该怎么做呢?
使用dynamic_cast

Derived* pDerived = dynamic_cast<Derived*>(pBase);

语法

dynamic_cast < 新类型 > ( 表达式 )	

若转型成功,则 dynamic_cast 返回 新类型 类型的值。若转型失败且 新类型 是指针类型,则它返回该类型的空指针。若转型失败且 新类型 是引用类型,则它抛出与类型 std::bad_cast 的处理块匹配的异常。

为了理解官方文档这段话,我写了下面的代码,在刚才的代码上修改,只修改了main函数中的内容:

int main()
{
	Base* pBase = new Derived();
	pBase->print();
	pBase->work();
	 
	Derived* pDerived = dynamic_cast<Derived*>(pBase); //向下转换成功,成功返回Derived*
	if (pDerived != nullptr)
	{
		pDerived->print();
		pDerived->work();
	}

	Base *pRealBase = new Base();
	pDerived = dynamic_cast<Derived*>(pRealBase); //向下转换失败,返回nullptr指针
	if (pDerived != nullptr)
	{
		pDerived->print();
		pDerived->work();
	}

	Base base;
	Base& refBase = base;
	try
	{
		Derived refDerived = dynamic_cast<Derived&>(refBase);
	}
	catch (const std::exception& e)
	{
		std::cout << "first try failed, reason: " << e.what() << std::endl;
	}
	
	Derived derived;
	Base& refBaseNew = derived;
	try
	{
		Derived refDerived = dynamic_cast<Derived&>(refBaseNew);
	}
	catch (const std::exception& e)
	{
		std::cout << "second try failed: reason: " << e.what() << std::endl;
	}

	getchar();
	return 0;
}

运行结果:

Derived print!
Base do work...
Derived print!
Derived do work...
first try failed, reason: Bad dynamic_cast!

小结:
dynamic_cast < new_type > ( expression )

在执行向下类型转换(基类向子类转换,叫“向下类型转换”),如果expression实际指向的类型与new_type一致,转换才能成功,否则转换失败。

dynamic_cast存在的问题:
dynamic_cast最大的问题在于效率,特别是继承体系特别深时。可以尝试用static_cast来替代dynamic_cast的使用。

对于效率问题,这篇博文里讲的比较好:https://blog.youkuaiyun.com/debugconsole/article/details/9379627

为什么说不要使用 dynamic_cast,需要运行时确定类型信息,说明设计有缺陷?

参考:https://blog.youkuaiyun.com/u011333734/article/details/81329523

http://www.luyixian.cn/news_show_19011.aspx

https://blog.youkuaiyun.com/daizhiyan1/article/details/82912399

C++(03):dynamic_cast dynamic_cast主要用于有继承关系的多态类(基类必须有虚函数)的指针或引用之间的转换。1.通过dynamic_cast,将派生类指针转换为基类指针(上行转换),这个操作与static_cast的效果是一样的。2.通过dynamic_cast,将基类指针转换为派生类指针(下行转换),dynamic_cast具有类型检查的功能,比static_cast更安全(如果转换的是指针,失败时会返回空指针;如果转换的是引用,会抛出std::bad_cast异常)... 阅读详情

相关推荐

C++ 中dynamic_cast使用详解和实战示例

当不确定指针实际指向哪个派生类时,用 dynamic_cast。当能确定类型时,用 static_cast。基类必须有虚函数。失败返回 nullptr。

qq_36812406的博客 1020

C++基础#20:C++中的动态强制dynamic_cast

C++中提供了动态强制(dynamic_cast),是一种运行时类型识别机制,可以从一个虚的基类强制到一个派生类。我们常常需要知道,在运行过程中,我们真正在使用的是哪个类的对象,这时,可以明确地使用dynamic_cast来得到运行时类型的信息。

记录和分享程序人生的点点滴滴 1万+

第 3 天:Actor 是什么?创建你的第一个游戏对象!

本文详细介绍 Actor 在 Unreal Engine 5 中的作用,并通过 C++ 创建你的第一个游戏对象。你将学习 Actor 的生命周期(BeginPlay、Tick)、如何添加组件(Static Mesh),并让 Actor 在游戏世界中运作。同时提供 常见问题解决方案,助你快速上手 UE5 C++ 开发!🎮 跟随本教程,构建属于你的第一个游戏对象!

m0_37643873的博客 2629

C++新特性08_强制转换dynamic_cast(具有虚函数基类的父转子的时候会存在越界问题,因此必须使用dynamic_cast在运行时检测转换是否安全、其本质是采用RTTI:运行时类型检测技术)

dynamic_cast用于具有虚函数的基类与派生类之间的指针或引用的转换。 使用的情况: (1)基类必须具备虚函数 原因:dynamic_cast是运行时类型检查,需要运行时类型信息(RTTI),而这个信息是存储与类的虚函数表关系紧密,只有一个类定义了虚函数,才会有虚函数表。 (2)运行时检查,转型不成功则返回一个空指针 (3)非必要不要使用DYNAMIC_CAST,有额外的函数开销 1.父类转子类情况下的越界问题: #include <iostream> #include <stri

分享学习成长历程,Winter is coming! 3397

如何利用Arcgis进行地统计学分析(三):空间插值方法选择与优化

本文深入探讨了在Arcgis中进行地统计学分析时,如何根据探索性数据分析(EDA)结果科学选择与优化空间插值方法。文章对比了IDW、RBF、克里金等主流方法的适用场景与核心参数,并通过实战案例详解了从数据诊断到模型调优的完整流程,强调结合半变异函数与趋势分析进行“对症下药”,以提升插值结果的精度与可靠性。

weixin_29281915的博客 120

高光谱目标检测论文学习(1)—— Hyperspectral Target Detection:Hypothesis Testing,SNR and SA Theories

前言 从这篇开始,将会学习一些高光谱目标检测的论文,我仍然把这篇文章放到了读论文专栏里,但是不对其进行顺序编号了,因为这个方向是比较小众的。今天来学习这篇TGRS2021的最新论文,讲的比较详细,相对比较适合初学者入门。我之前也写过一些有关目标检测的论文,但是高光谱目标检测(HTD)和之前的我们学的目标检测是不同的,因为其检测的对象不是普通摄像头得来的数字图像,而是高光谱遥感图像。其包含了很多光谱信息,而光谱信息本身经过处理后就可以作为特征,因此很多情况下就无需使用广义的目标检测问题中的卷积神经网络等方式去

MrBamboo2000的博客 7480

C++类型转换操作符 dynamic_cast

dynamic_cast 顾名思义是支持动态的类型转换,即支持运行时识别指针或引用所指向的对象。 dynamic_cast&lt;&gt;用于C++类继承多态间的转换,分为: 子类向基类的向上转型(Up Cast) 基类向子类的向下转型(Down Cast) 其中向上转型不需要借助任何特殊的方法,只需用将子类的指针或引用赋给基类的指针或引用即可,dynamic_cast向上转型其总是...

冰殇的博客 2170

Vivado新手必看:5分钟搞定FPGA程序固化到Flash(附MCS文件生成全流程)

本文为FPGA新手详细解析了如何将程序固化到Flash存储器的完整流程。核心在于理解SRAM工艺FPGA断电易失的特性,并利用Vivado工具将比特流文件转换为Flash可识别的MCS文件。文章重点拆解了生成MCS文件的关键配置步骤、硬件连接要点,以及通过JTAG烧写Flash的实战操作,并提供了常见启动失败问题的排查清单,帮助开发者实现设计从调试到产品部署的关键跨越。

weixin_29230901的博客 350

【C++】static_cast和dynamic_cast使用详解

`static_cast` 并不执行运行时类型检查。因此,如果你尝试执行一种不安全的转换,例如将基类指针转换为不相关的派生类指针,编译器可能不会发出警告或错误,但在运行时可能会导致未定义的行为。在这种情况下,你可能需要考虑使用 `dynamic_cast`,它执行运行时类型检查,但仅在涉及多态的情况下才适用。

AAADiao的博客 4517

plotly包安装_Plotly(一)安装指南

plotly,是一个快速完善并崛起的交互式的、开源的绘图库库,Python库则是它的一个重要分支。现已支持超过40种独特的图表类型,涵盖了广泛的统计、金融、地理、科学和三维用例。Plotly 通过JavaScript构建,能基于Web显示实现交互式的可视化效果(Plotly最强大之处之一)。所以它的图形呈现可以方便的显示于Jupyter notebook(基于html)、独立的html中(直接显示...

weixin_35907189的博客 3469

操作系统|知识梳理|复习(下)

操作系统复习

知识库搭建ing 1782

c++——dynamic_cast的使用

1)dynamic_cast要求操作数必须是多态类型(即要求父类要存在virtual虚函数); class Base { public: Base() { } ~Base() { } void test() { cout << "Base" << endl; } }; class Derived : public Base { public: Derived() { }

www_dong的博客 1838

YOLOv8 交通管理三大核心功能 —— 二、违章检测系统 详细解释及代码完整示例

YOLOv8交通违章检测系统

u010117029的博客 500

C++ 四种类型转换详解:static cast、dynamic cast、const cast、reinterpret cast 的使用场景

转换 | 编译期检查 | 运行期检查 | 类型安全性 | 主要限制 || 是 | 否 | 中 | 不能移除 const、不能转换无关类型 || 是(部分) | 是 | 高 | 必须有虚函数,有 RTTI 开销 |const_cast| 是 | 否 | 低 | 只能修改 const/volatile 属性 || 否 | 否 | 极低 | 几乎无约束,高度不可移植 |是日常使用最频繁的转换,处理编译期可验证的相关类型转换。记住它的“向下转型”是不安全的,除非你能确定实际类型。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 538

基于Simulink环境,提供一个关于如何对EMI抑制的DC-DC变换器进行仿真建模的示例

EMI定义:电磁干扰是指任何能中断、阻碍、降低或限制电气设备有效性能的电磁能量。重要性合规性:确保产品符合国际和地方的EMC标准。可靠性:减少因外部或内部EMI导致的系统故障风险。挑战滤波设计:合理设计输入输出滤波器以抑制传导EMI。布局与接地:良好的PCB设计对于减少辐射EMI至关重要。屏蔽:使用金属屏蔽来保护敏感电路不受外界干扰。首先明确要模拟的任务内容。设计一个能够在高频操作下有效抑制EMI的DC-DC变换器。根据工作频率和谐振元件值确定合适的滤波器参数。

xiaoheshang_123的博客 144

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

c++ dynamic_cast使用笔记

主要用于处理多态类型(即包含虚函数的类)。:基类必须至少有一个虚函数(如虚析构函数)。是处理多态类型安全的利器,但需谨慎使用。往往意味着设计需要重构。:始终检查指针是否为。

曾经也曾立志 797

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C++基础-> dynamic_cast使用及原理介绍

dynamic_cast是 C++ 中用于在运行时进行类型安全的向下转换(downcasting)和跨层次转换(cross-casting)的运算符。它主要用于将基类指针或引用转换为派生类指针或引用,依赖于运行时类型信息(RTTI)来确保转换的安全性。

weixin_41991826的博客 4692

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

[C/C++笔记] dynamic_cast的使用

dynamic_cast的使用

LPS 948

C++中static_cast, dynamic_cast, const_cast用法/使用情况及区别解析

目录 第1部分.隐式类型转换 第2部分. 显式类型转换 static_cast dynamic_cast reinpreter_cast const_cast 首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分.隐式类型转换 又称为“标准转换”,包括以下几种情况: 1) 算术转换(Arithmetic conversion) : 在...

SabreWulf 3088

C++ 中dynamic_cast的使用方法

/*这是从网上摘下的例子,主要讲述了 dynamic_cast<> 的使用方法。*/ /* 作用:将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理, 即会作一定的判断。 对指针进行dynamic_cast,失败返回null,成功返回正常cast后的对象指针; ...

dengji8846的博客 93

C++中dynamic_cast、static_cast、const_cast、reinterpret_cast 和 any_cast的使用区别

在进行类型转换时,应该尽可能地使用 C++ 中的类型安全机制,例如模板类和函数重载等。是一种非常危险的转换,因为它可能导致未定义行为,例如访问非法内存或破坏对象的类型信息。用于将一个指针或引用转换为另一种指针或引用类型,而不考虑类型之间的任何关系。类型的内存布局不同,因此可能会输出不正确的值。类型的对象的值可以在运行时动态地改变,因此可以用于实现动态类型的编程。类型的对象中保存的是其他类型的值,或者转换目标类型与实际类型不匹配,将抛出。类型的对象转换为指定类型的对象。类型的对象转换为指定类型的对象。

dhp811的专栏 1106

C++中static_cast/const_cast/dynamic_cast/reinterpret_cast的区别和使用

C风格的强制转换较简单,如将float a转换为int b,则可以这样:b = (int)a,或者b=int(a)。 C++类型转换分为隐式类型转换和显示类型转换。 隐式类型转换又称为标准转换,包括以下几种情况: (1)、算术转换:在混合类型的算术表达式中,最宽的数据类型成为目标转换类型; (2)、一种类型表达式赋值给另一种类型的对象:目标类型是被赋值对象的类型; (3)、将一个表达式作...

网络资源是无限的 1万+

C++中dynamic_cast简单使用说明

dynamic_cast如果直译就是动态分配的意思,这是一个在C++中比较有用的关键字,其使用的结构如下:          dynamic_cast  ( expression )      该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void*;        如果type-id是类指针类型,那么expression也必须是一

Hedpat's Blog | 黯風夜隱 883

C++: reinterpret_cast、dynamic_cast、static_cast的使用及注意事项

转发:https://blog.youkuaiyun.com/tiandao2009/article/details/79842006 标准C++中有四个类型转换符:static_cast、dynamic_cast、reinterpret_cast 和const_cast。在C++中,使用数据类型转换时,该怎样选用合适的数据类型转换方式很重要,下面分别对这几种转换方法做一说明: 1. static_cas...

qq_22613757的博客 281

C++ - Dynamic Cast的使用

dynamic_cast与其他几个cast的对比可以参见http://blog.youkuaiyun.com/fishhg/archive/2011/04/02/6296255.aspx 这个帖子主要来补充几点。

程序 = 实践 + 思考 (Programming = Practice + Thinking) 672

[C/C++]dynamic_cast最好不要使用

dynamic_cast简介: dynamic_cast是将一个基类对象指针(或引用)转换到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理。 RTTI简介: RTTI(Run-Time Type Identification)是面向对象程序设计中一种重要的技术。C++中的指针或引用(Reference)本身的类型,可能与它实际代表(指向或引用)的类型并不一致。有时我们需要将一个多态指针转换为其实际指向对象的类型,就需要知道运行时的类型信息,这就产生了运行时类型识别的要

小蜗牛之家 1432
上一篇: C++中强制变换之const_cast的疑惑
下一篇: C++中的虚析构函数
hp_cpp
博客等级 码龄11年 310粉丝 218原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值