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 ;
}
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操作符的更多相关文章
- Oracle 的基本操作符
!= 不等于 select empno,ename,job from scott.emp where job!='manager' ^= 不等于 select empno,ename,job from ...
- javascript中的操作符详解1
好久没有写点什么了,根据博主的技术,仍然写一点javascript新手入门文章,接下来我们一起来探讨javascript的操作符. 一.前言 javascript中有许多操作符,但是许多初学者并不理解 ...
- c# 基础 object ,new操作符,类型转换
参考页面: http://www.yuanjiaocheng.net/webapi/config-webapi.html http://www.yuanjiaocheng.net/webapi/web ...
- oracle操作符
Oracle中算术操作符(+)(-)(*)(/) 值得注意的是:/ 在oracle中就相当于显示中的除法 5/2 = 2.5 比较操作符: 其中等号可以换成其他运算符:(后面为该操作符的单条件查询样例 ...
- C# 本质论 第三章 操作符和控制流
操作符通常分为3大类:一元操作符(正.负).二元操作符(加.减.乘.除.取余)和三元操作符( condition?consequence:alternative(consequence和alterna ...
- SQL优化技术分析-1:操作符优化
1.IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格.但是用IN的SQL 性能总是比较低的,从Oracle执行的步骤来分析用IN的SQL与不用IN的SQL有 ...
- SQL连接操作符介绍(循环嵌套, 哈希匹配和合并连接)
今天我将介绍在SQLServer 中的三种连接操作符类型,分别是:循环嵌套.哈希匹配和合并连接.主要对这三种连接的不同.复杂度用范例的形式一一介绍. 本文中使用了示例数据库AdventureWorks ...
- Linux Shell脚本逻辑操作符简介
在写程序时,会用到条件判断,测试条件是否成立.很多时候,判断条件是多个的,这个时候需要用到逻辑操作符.shell脚本中常用的有哪些逻辑操作符呢? 1.逻辑与: -a 格式: conditon1 -a ...
- SQL操作符
Oracle中的操作符算术操作符:无论是在sqlserver,或者是java中,每种语言它都有算术操作符,大同小异. Oracle中算术操作符(+)(-)(*)(/) 值得注意的是:/ 在oracle ...
随机推荐
- 【JavaScript】下大雪
引用[JavaScript]满天星的代码,稍作修改的结果: function drawStars() { for (i = 1; i < 100; ++i) { ctx.fillText(&qu ...
- article标准用法
article代表一个在文档.页面或者网站中自成一体的内容 其目的是为了让开或重用 譬如论坛的帖子.博客的文章.一片用户的评论.一个互动的widget小工具 article 会有一个标题(通常在hea ...
- 什么是MSB/LSB码?
MSB是Most Significant Bit的缩写,最高有效位.在二进制数中,MSB是最高加权位.与十进制数字中最左边的一位类似.通常,MSB位于二进制数的最左侧,LSB位于二进制数的最右侧. L ...
- hbase 异常
1.org.apache.hadoop.hbase.ipc.CallTimeoutException a.出现情况描述:使用java API进行hbase数据的scan操作,发现有的数据可以scan到 ...
- nginx反向代理服务器端口问题
nginx可以很方便的配置成反向代理服务器 server { listen 80; server_name bothlog.com; location / { proxy_set_header H ...
- linux 进阶命令___0002
#列出重复文件,首先检查文件大小,再检查md5sum find -not -empty -type f -printf "%s\n" | sort -rn | uniq -d | ...
- sql报字段过大的错误解决方法
set global max_allowed_packet = 2*1024*1024*10
- 2.scala控制结构、函数、异常处理
2.scala控制结构.函数.异常处理---小书匠,在线编辑器,MARKDOWN,Evernote,文件版本 a:focus { outline: thin dotted #333; outline: ...
- Search In Rotated SortedArray2, 有重复数据的反转序列。例如13111.
问题描述:反转序列,但是有重复的元素,例如序列13111. 算法思路:如果元素有重复,那么left-mid,就不一定是有序的了,所以不能利用二分搜索,二分搜索必须是局部有序.针对有序序列的反转,如果有 ...
- Pandas数据帧(DataFrame)
数据帧(DataFrame)是二维数据结构,即数据以行和列的表格方式排列. 数据帧(DataFrame)的功能特点: 潜在的列是不同的类型 大小可变 标记轴(行和列) 可以对行和列执行算术运算 结构体 ...