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. Nginx 301与302配置

    说明 1.首先看一个完整代码示例,关于nginx 301 302跳转的. 301跳转设置: server { listen 80; server_name 123.com; rewrite ^/(.* ...

  2. jetbrains goland 跳到上一个光标处

    查了下是 :Ctrl + Alt + 左右 mac下面是:Command+ Alt + 左右键 但是我用下来是切上面打开文档页 摸索了下是:Ctrl +Win+ Alt + 左右  我的键的映射是De ...

  3. qt项目: error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1900”不匹配值“1800”

    error LNK2038: 检测到“_MSC_VER”的不匹配项:  值“1900”不匹配值“1800” 该错误 网上通常的解释是: 原因:由于你使用了vs2012,相比较vs2010以及之前的vs ...

  4. 【I/O】File常见用法总结

    java.io.File file可能是一个文件或者文件夹. 获取目录列表(全部/过滤) import java.io.File; import java.io.FilenameFilter; imp ...

  5. Execute Disable Bit

    “Execute Disable Bit”是Intel在新一代处理器中引入的一项功能,开启该功能后,可以防止病毒.蠕虫.木马等程序利用溢出.无限扩大等手法去破坏系统内存并取得系统的控制权.其工作原理是 ...

  6. 使用Idea 配置maven

    使用Idea 配置maven 使用idea 配置maven有4步: (1)下载Idea,maven (2)安装idea, (3)设置maven的环境变量, (4)具体的配置过程 当前环境: 操作系统: ...

  7. Spring -- aop(面向切面编程),前置&后置&环绕&抛异常通知,引入通知,自动代理

    1.概要 aop:面向方面编程.不改变源代码,还为类增加新的功能.(代理) 切面:实现的交叉功能. 通知:切面的实际实现(通知要做什么,怎么做). 连接点:应用程序执行过程期间,可以插入切面的地点. ...

  8. root run-parts

    crontab的文件格式 分 时 日 月 星期 要运行的命令 第1列分钟0-59 第2列小时0-23(0表示子夜) 第3列日1-31 第4列月1-12 第5列星期0-7(0和7表示星期天) 第6列要运 ...

  9. 报错cannot be cast to javassist.util.proxy.Proxy

    出现这种错误还有一个原因:hibernate和struts中都有javassit的jar包,把其中的低版本删除就行了.

  10. FMDB官方使用文档 G-C-D的使用 提高性能(翻译)

    由于FMDB是建立在SQLite的之上的,所以你至少也该把这篇文章从头到尾读一遍.与此同时,把SQLite的文档页 加到你的书签中.自动引用计数(APC)还是手动内存管理呢?   两种都行,FMDB会 ...