dynamic_caast操作符
dynamic_caast操作符,将基类的指针或引用安全的转换为派生类的指针或引用。
原理:
将一个基类对象指针或引用抛到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理
返回值 :
指针的动态转型:
-正确执行时,结果为指向目标类对象的指针
-错误执行时,结果为0/null (C++ 11 :nullptr)
引用的动态转型:
-正确执行时,结果为目标类的引用
-错误执行时,引发bad_cast异常
注意:
dynamic_cast在将父类cast到子类时,父类必须要有虚函数。
#include "stdafx.h" #include<iostream> #include<vector> #include<typeinfo> using namespace std;class Employee { public:virtual void PaySalary();virtual void PayBonus(); };class Manager :public Employee { //公有继承Employee public:void PaySalary() override;void PayBonus() override; };class Programmer :public Employee { public:void PaySalary() override;void PayBonus() override; };class Company { public:virtual void PayRoll(Employee *e);virtual void PayRoll(Employee &e); private:vector<Employee *> _employees; }; /* void Company::PayRoll(Employee *e) {e->PaySalary();e->PayBonus(); } */ void Company::PayRoll(Employee *e) { //版本二Programmer *p = dynamic_cast<Programmer *>(e);if (p) {p->PayBonus();p->PaySalary();}else //不发奖金e->PaySalary(); } void Company::PayRoll(Employee &e) { //版本二try {Programmer &p = dynamic_cast<Programmer&>(e);p.PaySalary();p.PayBonus();}catch (bad_cast) {e.PaySalary();} }int main() {return 0; }
static_cast 静态类型的用途
与dynamic_cast不同,static_cast不仅可用于指针和引用,还可以用于其他型式
一般用于非类型式的普通数据对象转型
不进行运行期型式检查,不安全
若转型失败,结果无定义
const_cast 常量转型
用于取消或设置量的const状态(比如改变const的值,或者取消量的const状态,或者把一个量设置为const)
//
如果原始数据对象不能写入,则取消常量修饰可以能会导致未知结果
class ConstCastTest { public:void SetNum(int _num) {num = _num;}void PrintNum() const; private:int num; }; void ConstCastTest::PrintNum() const {//临时取消常量约束,修改目标对象的内容const_cast<ConstCastTest *>(this)->num--;cout << num << endl; }
转载于:https://www.cnblogs.com/hutonm/p/6830030.html
dynamic_caast操作符相关推荐
- 2021年大数据常用语言Scala(六):基础语法学习 数据类型与操作符
数据类型与操作符 scala中的类型以及操作符绝大多数和Java一样,我们主要来学习 与Java不一样的一些用法 scala类型的继承体系 数据类型 基础类型 类型说明 Byte 8位带符号整数 Sh ...
- RxJava 变换操作符Map
看下文档如下 通过对每个项目应用函数来转换Observable发出的项目 个人理解为转换类型 下面写一个把int 类型转换为String 类型的demo Observable.create(new O ...
- RxJava 操作符 do
看下文档给的图片 注册一项操作以应对各种可观察的生命周期事件 do的操作符有很多具体如下 下面看下器使用 Observable.create(new ObservableOnSubscribe< ...
- MySQL 学习笔记(16)— 子查询(单行单列、一行多列、多行多列、 ALL、ANY、SOME 运算符、EXISTS 操作符)
1. 子查询概念 子查询是指嵌套在其他语句(SELECT . INSERT . UPDATE . DELETE 等)中的 SELECT 语句:子查询也称为内查询( inner query )或者嵌套查 ...
- NET基础(3):is 和 as 操作符
在C#语言中进行类型转换的另外一种方式是使用is和as操作符.is检查对象是否兼容于指定类型,返回Boolean值true或false.注意,is操作符永远不抛出异常,例如以下代码: Object o ...
- java 1%10_Java 操作符与运算符详解
一.赋值操作符 1 有哪些赋值操作符 2 需要注意的地方 1) a+=b; ==> a = a+b; a-=b; ==>a = a-b; a =-b;//注意这里-不要写在=的后面 2) ...
- C# checked、unchecked操作符
checked和unchecked操作符用于整型算术运算时控制当前环境中的溢出检查.下列运算参与了checked和unchecked检查(操作数均为整数): 1) 预定义的++和――一元运算符. 2 ...
- sizeof 操作符详解
1. 定义: sizeof是何方神圣? sizeof 乃 C/C++ 中的一个操作符(operator)是也.简单说其作用就是返回一个对象或者类型所占的内存字节数. MSDN上的解释为: The si ...
- C++拾趣——有趣的操作符重载
操作符重载是C++语言中一个非常有用的特性.它可以让我们比较优雅的简化代码,从而更加方便的编写逻辑. 为什么要使用操作符重载 一种常见的用法是重载<<运算符,让标准输出可以输出自定义的类型 ...
最新文章
- 身份证号信息后台匹配
- Linux下独立添加PHP扩展模块 mssql
- 在VS2010 里面包含进全局的include目录和lib目录
- oracle初始化序列值,如何修改序列(Sequence)的初始值(START WITH)
- 不明意义的字符串匹配问题
- 拓端tecdat|R语言基于树的方法:决策树,随机森林,Bagging,增强树
- cad插件苹果系统_CAD看图软件mac版|CAD迷你看图 for Mac下载 v4.0.0 官方版_最火软件站...
- Glide加载圆形图片并且带边框
- 高通驱动开发参考(二)
- easyexcel表头和内容居中
- FFmpeg 源码之内存管理函数族
- 吊打面试官之一面项目介绍
- 迎战618大促 京东技术大“阅兵”
- layui 合并单元格
- 在 2020 秋招中没有取得理想的 offer,可以提前为2021春招做哪些准备?
- 什么是科技创业公司?
- 一套手机点餐收银系统源码,系统功能完善、页面美观,开源分享!
- YOLOv5s网络结构详解
- 跟我学修彩电视频教程
- maya怎么贴膜_maya如何渲染成白膜
热门文章
- Magicodes.WeiChat——媒体资源选择组件之media-choice(开源)
- 23种设计模式的索引
- 多VLAN环境下DHCP服务的实现
- 深度学习笔记7 Working with Large Images 卷积特征提取
- Leetcode 122. 买卖股票的最佳时机 II 解题思路及C++实现
- Windows系统笔记本禁用自带键盘
- outlook从服务器中恢复已删除项目,Exchange 恢复已删除项目
- php只显示指定文件类型_php强制下载指定类型的文件
- v-if和v-show的异同
- DATE_FORMAT() 函数||DATE_SUB() 函数