dynamic_cast操作符的用法

dynamic_cast用法总结 dynamic_cast是C++ RTTI技术之一,那么它的应用场景是什么呢?我觉得学习一个东西得先明白它的应用场景,有了应用场景才明白为什么需要它。 dynamic_cast应用场景 C++是具有多态性的语言,有时候我们会面临这样的情况:手头只有一个基类类型的指针,但我们却希望用它来获取一些派生类中的相关信息,比如调用派生类的成员函数或者访问派生类的成员变量等,那么此时我们就需要用到dynamic_cast。它能够进行指针(或引用)安全的类型向下转换(downcasting,即从基类类型的指针转换为派生类 阅读详情

参考C++ prime 第四版 9.1.1节

 

  1. dynamic_cast 是个在运行时执行的操作符
  2. dynamic_cast的作用: dynamic_cast用来把一个类的指针(引用)转换成同一类层次结构的其它类的指针(引用)
  3. dynamic_cast每次执行两个操作:类型检查和类型转换,只有在类型检查正确的情况下,才进行类型转换。
  •      对于类类型指针之间的转换,可以通过dynamic_cast操作符的返回值进行判断,如果转换失败会返回0,通过if判断可以查看是否转换成功。
  •      对于类引用类型之间的转换,如果转换失败会抛出异常,对抛出的异常进行处理时会给程序带来相应的开销,如构造异常对象等。

      dynamic_cast 被用来执行从基类指针到派生类指针的安全转换,它常常被称为安全的向下转换 downcasting。 当我们必须使用派生类的特性,而该特性又没有出现在基类中时我们常常使用 dynamic_cast, 用指向基类类型的指针来操纵派生类类型的对象,通常通过虚拟函数自动处理 。但是在某些情形下,使用虚拟函数是不可能的 。dynamic_cast 为这些情形提供了替代的机制,但是这种机制比虚拟成员函数更易出错,应该小心使用。 如果我们希望扩展某个类库,不能增加虚拟成员函数,但我们可能仍然希望增加功能,在这种情况下,就必需使用  dynamic_cast  。

 

下面是一个dynamic_cast使用例子

场景:我们购买了一个类库产品,该类实现计算薪水功能:假如公司有两类员工,项目经理和程序员,对于代码实现方式,我们可以定义一个基类employee,里面定义虚函数getSalary进行薪水的计算。项目经理类manager和程序员programmer继承employee实现相应的getSalary虚函数。但是由于薪资改革,需要给程序员programmer分发奖金,这样薪水的计算方式需要发生变化,直接的方法是修改基类

添加奖金的计算虚拟函数getBonus,然后所有的基类实现该函数,重新编译程序,但是该类是购买产品该方法是行不通的(实际未必如此,只是举个例子),我们可以单独为programmer类实现getBonus方法,此时需要dynamic_cast操作符,把基类指针转换成programmer指针,然后调用programmer的getBonus方法。

   代码如下

 

#include <iostream>

using namespace std;

class employee {
public:
 virtual int getSalary() = 0;
};

class manager:public employee{
public:
 virtual int getSalary() {
  return 700;
 }
};

class programmer:public employee{
public:
 virtual int getSalary() {
  return 200;
 }

 int getBonus() {
  return 300;
 }
};

int get_salary(employee *pe) {
 int salary = 0;

 programmer *prg = dynamic_cast<programmer*>(pe);

 if (prg != NULL) {
  salary = prg->getSalary() + prg->getBonus();
  cout<<"programmer  ";
 }
 else {
  salary = pe->getSalary();
  cout<<"manager  ";
 }

 return salary;
}

int _tmain(int argc, _TCHAR* argv[])
{
 employee *prg = new programmer();
 employee *pmg = new manager();

 cout<<"programmer : "<<get_salary(prg)<<endl;
 cout<<"mamager: "<<get_salary(pmg)<<endl;
 return 0;
}

 

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

相关推荐

C++ 中的类型转换: static_cast dynamic_cast const_cast reinterpret_cast

C++ 提供了四种主要的类型转换操作符:、、 和 。 是最常用的类型转换操作符,用于编译时已知类型的转换。 无法移除const 修饰的类型。 2. 用法: 主要用于多态类型之间的向下转型(downcasting),并且会在运行时进行类型检查。如果转换失败,返回空指针(对于指针)或抛出异常(对于引用)。 3. 用法: 用于添加或移除变量的 或 属性。它是唯一可以修改常量性的转换操作符。 4. 用法: 是最危险的一种类型转换,它重新解释底层位模式,不做任何类型检查。适用于低级操作,如直

h a 6 6 6 c k 为 你解决复杂难题! 167

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

dynamic_cast的使用

LPS 948

标准化降水指数介绍

Mckee et al.(1993)认为降水量的减少是导致干旱的主要因素,其他气候因子一般变化较小,对干旱产生的影响不大,因此SPI使用降水量作为唯一参数。SPI能较好表达因降水量的大小反映干旱状况,操作简单,所需资料仅为降水量,同时该干旱指数在各个地区和各个时段都具有良好的计算稳定性,是继PDSI之后另一种被广泛应用的干旱指数。𝐻(𝑥)是Γ分布求得的概率,并当𝐻(𝑥)>0.5时,S=1;式中,𝛼是形状参数,𝛽是尺度参数,𝑥是当月降水量,𝛤(𝛼)是Gamma函数,用极大似然估计法计算最佳的𝛼和𝛽,即。

weixin_44259522的博客 2857

【C++】dynamic_cast基本用法(详细讲解)

👉博__主👈:米码收割机👉技__能👈:C++/Python语言👉公众号👈:测试开发自动化【获取源码+商业合作】👉荣__誉👈:阿里云博客专家博主、51CTO技术博主👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。

测试开发自动化 1万+

Java对接海康威视明眸门禁设备

海康威视合作生态致力打造一个能力开放体系、两个生态圈,Hikvision AI Cloud开放平台是能力开放体系的核心内容。它是海康威视基于多年在视频及物联网核心技术积累之上,融合AI、大数据、云计算等技术,为合作伙伴提供的一个二次开发及创新的平台。的SDK复制到linux的lib目录下(如果是docker发布,记得做好共享映射哦)大家有没有想过,windows版的SDK为什么要复制到项目根目录的lib文件夹下?所以发布到linux的时候,我们需要将。打开AcsMain文件。................

Good Luck 7875

有史以来最小的GIF/png/jpg/jpeg

昨天我对图像进行了 base64 编码,这样我就可以将它发送到 CouchDB 以测试我正在为客户编写的一些代码。它让我想起了我之前在远程服务器上设置 cookie 时所做的事情。基本上,一个小的 PHP 脚本被放在远程服务器上,它接受几个 GET 参数并根据它们的值设置一些 cookie。然后脚本输出一个 1x1 的透明 GIF。本地服务器上的 PHP 脚本生成了一个 IMG 标签,该标签链接到该图像并根据本地服务器上的 COOKIES 设置参数。

凌凌1301的博客 1417

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

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

weixin_41991826的博客 4692

vCenter Server出现no healthy upstream的解决方法

可以通过"VMware vCenter Server Management(服务)"来排查问题,在网页里面找到“服务”模块,会发现有很多服务没有启动起来,而且手动启动也无法启动。7.0 地址后,页面出现“no healthy upstream”,无法正常登录vCenter,重启后依旧如此,该故障的前提是没有对vCenter做过任何配置,如下图所示。于是用命令查询是否有证书过期,发现真有多个服务依赖的证书在当天早上过期。使用如下命令尝试打开服务发现不分服务可以打开,不分服务无法打开。

1万+

dynamic_cast操作

dynamic_cast用法总结

qq_39607707的博客 326

【完美解决】Anaconda3安装后缺失大量文件,没有scripts、Library等目录

Anaconda3是官网下载的:https://www.anaconda.com/distribution/#download-section 我选择的是64位python 3.7的版本。 问题出现及现象: 我自己选择了一个D盘的目录D:\Tools\Anaconda3进行安装,装完后发现conda list命令无法执行,首先都到的是配置环境变量,然后发现安装目录下缺失大量文件(如下图)...

android之行 3万+

【银河麒麟服务器操作系统】安装英伟达4090D显卡驱动操作指南

本文详细介绍了在银河麒麟高级服务器操作系统V10SP3-2403-X86版本上安装NVIDIA RTX4090D显卡驱动的完整流程。主要内容包括:准备工作检查、开源驱动禁用、运行级别切换、依赖包安装以及交互式安装过程中的关键选项选择(32位库选Yes、X配置选No)。通过禁用nouveau驱动、重建内核引导等步骤确保驱动安装成功,最后通过nvidia-smi命令验证驱动安装情况。文档提供了操作检查表和安装流程图,帮助用户在银河麒麟系统上顺利完成显卡驱动部署。

信创运维工程师 · 银河麒麟 & 容器实战 | 金融生产环境迁移·等保加固 | 142篇原创·17万+阅读 3100

[C++] 类型转换操作符(static_cast、dynamic_cast、const_cast、reinterpret_cast)

说明:本文主要解释static_cast、dynamic_cast、const_cast、reinterpret_cast这几种类型转换操作符。接下来我们对每一个类型转换操作符进行详细说明并给出一些基本的使用方式,重在深入理解。在解释类型转换操作符之前,我们先了解下,为什么要引入类型转换操作符?C语言本身就支持请值类型转换,那么C++为什么还要引入类型转换操作符呢,其实C++中引入类型转换操作符的设计目的是为了增强类型安全性和程序可靠性。

wangdsh的博客 1625

Java:PriorityQueue详解——从零基础到应用

看了网上的详解,我反是一篇没看懂,都是什么垃圾玩意也发出来,无语,我自己根据这两天的学习总结出来了下面这些干货,我就是这么学会的,大家要是零基础看肯定木问题。

流楚丶格念的博客 6141

类型转换操作符Cast Operators

C++ 类型转换操作符C语言的类型转换操作有其局限性,因此C++语言增加了4个类型转换操作符。 reinterpret_cast dynamic_cast static_cast const_cast 它们的语法都是一致的:xxxx_cast < type-id > ( expression )reinterpret_cast 对原始比特位重解释 顾名思义,reinterpret 就是重解释,r

techx的专栏 948

UDPProbe UDP端口存活探测(发送特征包+响应分析)、UDP服务识别

qDebug() << "收到响应:" << ip.toString() << ":" << port << " 服务:" << serviceName << " 响应长度:" << response.size();qDebug() << "开始探测:" << targetIp << ":" << port << " 超时时间:" << timeout << "ms";qInfo() << "\n==================== UDP探测结果 ====================";

寒寒豆豆软件公司的博客 146

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++类型强转详解const_cast,reinterpret_cast,static_cast与dynamic_cast

需要注意的是,这种类型转换是在编译时进行转换,并且不会进行运行时类型检查(RTTI),因此他从子类转父类是安全的,从父类向子类是不安全的,不安全就类似于强制转换。是最不安全的类型转换操作符,通常用于在不相关类型之间进行转换,或者将指针和整数类型之间进行转换。这种方式虽然简单,但缺乏明确性(可读性也一般般)和安全性,编译器不会检查转换的有效性。在 C++ 中,类型转换是一个常见的需求。)之外,C++ 提供了更安全、可读性更强的类型转换操作符,包括。本文将详细介绍这些操作符的用法,并对比它们之间的区别。

ye_yumo的博客 1211

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C++ 中 dynamic_cast 的作用

dynamic_cast是C++四个强制类型转换操作符中最特殊的一个,它支持运行时识别指针或引用。 dynamic_cast 用于类继承层次间的指针或引用转换。主要还是用于执行“安全的向下转型(safe downcasting)”,也即是基类对象的指针或引用转换为同一继承层次的其他指针或引用。 至于“向上转型”(即派生类指针或引用类型转换为其基类类型),本身就是安全的,尽管可以使用dynamic_cast进行转换,但这是没必要的, 普通的转换已经可以达到目的。 “向下转型”的前提条件:被转换对象必须是

weixin_44218779的博客 2907

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

dynamic_cast详解

转自http://blog.youkuaiyun.com/wingfiring/article/details/633033 作为四个内部类型转换操作符之一的dynamic_cast和传统的C风格的强制类型转换有着巨大的差别。除了dynamic_cast以外的转换,其行为的都是在编译期就得以确定的,转换是否成功,并不依赖被转换的对象。而dynamic_cast则不然。在这里,不再讨论其他三种转换和C风格的转

菜鸟的学习之路 1744

static_cast, dynamic_cast和reinterpret_cast的区别和应用

其实不仅仅是一个转载,还是一个融合 今天的一个考题为:#include using namespace std; class BClass { public:     BClass(){};     virtual ~BClass(){};     virtual void OutPut(int i){cout }; class son1:public BClass

meimeng515的专栏 8683

C++转型操作符:const_cast, static_cast, dynamic_cast和reinterpret_cast

参考资料 [1]Effective C++ 中文版(第三版)P24~25,P116 [2]const_cast_百度百科

OneSea 785

static_cast、dynamic_cast、reinterpret_cast和const_cast之间的区别

1、C++中的static_cast执行非多态的转换,用于代替C中通常的转换操作。因此,被做为隐式类型转换使用。比如:int i;float f = 166.7f;i = static_cast<int>(f);此时结果,i的值为166。2、C++中的reinterpret_cast主要是将数据从一种类型的转换为另一种类型。所谓“通常为操作数的位模式提供较低层的重新解释”也就是说将数据...

weixin_34344403的博客 541

dynamic_cast

作为四个内部类型转换操作符之一的dynamic_cast和传统的C风格的强制类型转换有着巨大的差别。除了dynamic_cast以外的转换,其行为的都是在编译期就得以确定的,转换是否成功,并不依赖被转换的对象。而dynamic_cast则不然。在这里,不再讨论其他三种转换和C风格的转换。 首先,dynamic_cast依赖于RTTI信息,其次,在转换时,dynamic_cast会检查转换的sou

Beyond.cn 953

C++中的dynamic_cast函数

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

563

【C++入门到精通】C++类型的转换 | static_cast | reinterpret_cast | const_cast | dynamic_cast [ C++入门 ]

本文将继续讲解C++类型的转换,主要介绍static_cast、reinterpret_cast、const_cast和dynamic_cast这四种类型转换操作符的用法和特点。在C++中,类型转换是一种将一个数据类型转换为另一个数据类型的机制,用于在编程过程中灵活地处理不同数据类型之间的转换需求。本文将依次介绍这四种类型转换操作符的作用和适用场景,并给出相应的示例代码以说明其用法。同时,对于每种类型转换操作符,还会探讨其使用时需要注意的问题,以确保类型转换的安全性和正确性。

Yawesh的博客 1587

dynamic_cast、static_cast、const_cast 和 reinterpret_cast

一、dynamic_cast:      用法:      dynamic_cast   (expression).将expression转化为具有type-id型的指针。type-id必须是一个      指针、引用(一个已经定义的类)或者void指针。如果是个指针,ex

慢慢的前进 689
上一篇: 类声明中关键字的位置
下一篇: 关于SO_REUSEADDR和SO_REUSEPORT的使用
StevenUNP
博客等级 码龄18年 3粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值