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 ;
}

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;
}

dynamic_caast操作符的更多相关文章

  1. Oracle 的基本操作符

    != 不等于 select empno,ename,job from scott.emp where job!='manager' ^= 不等于 select empno,ename,job from ...

  2. javascript中的操作符详解1

    好久没有写点什么了,根据博主的技术,仍然写一点javascript新手入门文章,接下来我们一起来探讨javascript的操作符. 一.前言 javascript中有许多操作符,但是许多初学者并不理解 ...

  3. c# 基础 object ,new操作符,类型转换

    参考页面: http://www.yuanjiaocheng.net/webapi/config-webapi.html http://www.yuanjiaocheng.net/webapi/web ...

  4. oracle操作符

    Oracle中算术操作符(+)(-)(*)(/) 值得注意的是:/ 在oracle中就相当于显示中的除法 5/2 = 2.5 比较操作符: 其中等号可以换成其他运算符:(后面为该操作符的单条件查询样例 ...

  5. C# 本质论 第三章 操作符和控制流

    操作符通常分为3大类:一元操作符(正.负).二元操作符(加.减.乘.除.取余)和三元操作符( condition?consequence:alternative(consequence和alterna ...

  6. SQL优化技术分析-1:操作符优化

    1.IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格.但是用IN的SQL 性能总是比较低的,从Oracle执行的步骤来分析用IN的SQL与不用IN的SQL有 ...

  7. SQL连接操作符介绍(循环嵌套, 哈希匹配和合并连接)

    今天我将介绍在SQLServer 中的三种连接操作符类型,分别是:循环嵌套.哈希匹配和合并连接.主要对这三种连接的不同.复杂度用范例的形式一一介绍. 本文中使用了示例数据库AdventureWorks ...

  8. Linux Shell脚本逻辑操作符简介

    在写程序时,会用到条件判断,测试条件是否成立.很多时候,判断条件是多个的,这个时候需要用到逻辑操作符.shell脚本中常用的有哪些逻辑操作符呢? 1.逻辑与: -a 格式: conditon1 -a ...

  9. SQL操作符

    Oracle中的操作符算术操作符:无论是在sqlserver,或者是java中,每种语言它都有算术操作符,大同小异. Oracle中算术操作符(+)(-)(*)(/) 值得注意的是:/ 在oracle ...

随机推荐

  1. JavaWeb请求中文乱码

    解决中文乱麻问题,页面端发出的数据作两次encodeURI var name="张三"; encodeURI(encodeURI(name)); 后台解码: URLDecoder. ...

  2. Apache 访问控制

    Apache访问控制 通过设置访问控制,可对网站进行权限管理,提高安全性. 参数介绍 <Directory />: 行为对根目录的限制 Options:允许使用控制目录特征的指令.他们包括 ...

  3. 20145235李涛《网络对抗》Exp9 Web安全基础实践

    基础问答 SQL注入攻击原理,如何防御? SQL注入攻击就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意SQL命令的目的. 对于SQL注入攻击的防范 ...

  4. win10安装z3求解器

    因为课程要求,我不得不接触求解器,之前有在ubuntu上装过一个叫stp的求解器,没怎么用: 今天在我的电脑(win10)上上装了一款更方便的求解器---z3,下面先详细介绍一下怎么安装和配置: 1. ...

  5. Python 类的方法,下划线有什么不同?

    问: 1,以一个下划线开头的命名 ,如_getFile2,以两个下划线开头的命名 ,如__filename3,以两个下划线开头和结尾的命名,如 __init__()4,其它这些命名有什么不同吗? 答:

  6. centos/linux扩容Swap分区

    查看现在的swap容量 [root@node1 ~]# free -h total used free shared buff/cache available Mem: 15G 3.8G 2.1G 5 ...

  7. NOIP 能量项链

    描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定等于 ...

  8. 深入解析Linux内核及其相关架构的依赖关系

    Linux kernel 成功的两个原因: 灵活的架构设计使得大量的志愿开发者能够很容易加入到开发过程中:每个子系统(尤其是那些需要改进的)都具备良好的可扩展性.正是这两个原因使得Linux kern ...

  9. Spring注解(事务)

    spring操作数据库 jdbc <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --> & ...

  10. PAT1051. Pop Sequence (25)

    #include <iostream> #include <stack> using namespace std; int sizeMax,n,k; stack<int& ...