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. vue-scroller的使用

    一 安装 使用npm 安装 npm install vue-scroller -S 二 引入 https://www.jianshu.com/p/a39f5276ff0b https://www.np ...

  2. Django---自定义admin组件思维导图

  3. Sybase数据库:两个特别注意的地方

    Sybase数据库:两个特别注意的地方 一.字段别名 字段别名不能为查询条件中的列名,会导致查询出来的数据不准确:最好字段别名为非列名: 二.更新的表名的大小写 update a set .... s ...

  4. HTML5 SVG世界地图

    在线演示 本地下载

  5. ping主机脚本

    #!/bin/bash #ping net='172.16.1' uphosts=0 downhosts=0 for i in {1..254};do ping -c 1 -w 1 ${net}.${ ...

  6. javascript设计模式 - 解释器模式(interpreter)

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. JAVA基础补漏--继承

    子类的对象在创建时,首先调用父类的构造函数,再调用子类自己的构造函数. 子类的构造函数中,有一个默认的super(),为一个无参调用,这个不显示,但会被首先调用,所有才会有父类构造函数被调用的情况. ...

  8. 利用OPENSSH自身记录密码

    大家都知道,OPENSSH是基于Linux下,一款开源,安全性不错的Linux SSH会话连接工具. 在渗透当中,当我们get root了.我们如何来记录Linux管理员登陆过的SSH? 想法如下: ...

  9. MyEclipse安装aptana插件, 8.5之前版本 和 之后版本, MyEclipse10安装aptana

    MyEclipse8.5安装aptana插件说明: 1.在myeclipse的安装目录下,有个common文件夹,建一个myplugIns,此目录下建aptana_update_024747目录 2. ...

  10. java Graphics2d消除锯齿,使字体平滑显示

    Java 2D API 提供的文本处理功能进行美化.Java 2D API 的文本功能包括: 使用抗锯齿处理和微调(hinting)以达到更好的输出质量 可以使用系统安装的所有字体 可以将对图形对象的 ...