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操作符相关推荐

  1. 2021年大数据常用语言Scala(六):基础语法学习 数据类型与操作符

    数据类型与操作符 scala中的类型以及操作符绝大多数和Java一样,我们主要来学习 与Java不一样的一些用法 scala类型的继承体系 数据类型 基础类型 类型说明 Byte 8位带符号整数 Sh ...

  2. RxJava 变换操作符Map

    看下文档如下 通过对每个项目应用函数来转换Observable发出的项目 个人理解为转换类型 下面写一个把int 类型转换为String 类型的demo Observable.create(new O ...

  3. RxJava 操作符 do

    看下文档给的图片 注册一项操作以应对各种可观察的生命周期事件 do的操作符有很多具体如下 下面看下器使用 Observable.create(new ObservableOnSubscribe< ...

  4. MySQL 学习笔记(16)— 子查询(单行单列、一行多列、多行多列、 ALL、ANY、SOME 运算符、EXISTS 操作符)

    1. 子查询概念 子查询是指嵌套在其他语句(SELECT . INSERT . UPDATE . DELETE 等)中的 SELECT 语句:子查询也称为内查询( inner query )或者嵌套查 ...

  5. NET基础(3):is 和 as 操作符

    在C#语言中进行类型转换的另外一种方式是使用is和as操作符.is检查对象是否兼容于指定类型,返回Boolean值true或false.注意,is操作符永远不抛出异常,例如以下代码: Object o ...

  6. java 1%10_Java 操作符与运算符详解

    一.赋值操作符 1 有哪些赋值操作符 2 需要注意的地方 1) a+=b; ==> a = a+b; a-=b; ==>a = a-b; a =-b;//注意这里-不要写在=的后面 2) ...

  7. C# checked、unchecked操作符

    checked和unchecked操作符用于整型算术运算时控制当前环境中的溢出检查.下列运算参与了checked和unchecked检查(操作数均为整数): 1)  预定义的++和――一元运算符. 2 ...

  8. sizeof 操作符详解

    1. 定义: sizeof是何方神圣? sizeof 乃 C/C++ 中的一个操作符(operator)是也.简单说其作用就是返回一个对象或者类型所占的内存字节数. MSDN上的解释为: The si ...

  9. C++拾趣——有趣的操作符重载

    操作符重载是C++语言中一个非常有用的特性.它可以让我们比较优雅的简化代码,从而更加方便的编写逻辑. 为什么要使用操作符重载 一种常见的用法是重载<<运算符,让标准输出可以输出自定义的类型 ...

最新文章

  1. 身份证号信息后台匹配
  2. Linux下独立添加PHP扩展模块 mssql
  3. 在VS2010 里面包含进全局的include目录和lib目录
  4. oracle初始化序列值,如何修改序列(Sequence)的初始值(START WITH)
  5. 不明意义的字符串匹配问题
  6. 拓端tecdat|R语言基于树的方法:决策树,随机森林,Bagging,增强树
  7. cad插件苹果系统_CAD看图软件mac版|CAD迷你看图 for Mac下载 v4.0.0 官方版_最火软件站...
  8. Glide加载圆形图片并且带边框
  9. 高通驱动开发参考(二)
  10. easyexcel表头和内容居中
  11. FFmpeg 源码之内存管理函数族
  12. 吊打面试官之一面项目介绍
  13. 迎战618大促 京东技术大“阅兵”
  14. layui 合并单元格
  15. 在 2020 秋招中没有取得理想的 offer,可以提前为2021春招做哪些准备?
  16. 什么是科技创业公司?
  17. 一套手机点餐收银系统源码,系统功能完善、页面美观,开源分享!
  18. YOLOv5s网络结构详解
  19. 跟我学修彩电视频教程
  20. maya怎么贴膜_maya如何渲染成白膜

热门文章

  1. Magicodes.WeiChat——媒体资源选择组件之media-choice(开源)
  2. 23种设计模式的索引
  3. 多VLAN环境下DHCP服务的实现
  4. 深度学习笔记7 Working with Large Images 卷积特征提取
  5. Leetcode 122. 买卖股票的最佳时机 II 解题思路及C++实现
  6. Windows系统笔记本禁用自带键盘
  7. outlook从服务器中恢复已删除项目,Exchange 恢复已删除项目
  8. php只显示指定文件类型_php强制下载指定类型的文件
  9. v-if和v-show的异同
  10. DATE_FORMAT() 函数||DATE_SUB() 函数