dynamic_cast操作符的用法
来源:互联网 发布:小米台灯 知乎 编辑:程序博客网 时间:2024/05/01 21:24
参考C++ prime 第四版 9.1.1节
- dynamic_cast 是个在运行时执行的操作符
- dynamic_cast的作用: dynamic_cast用来把一个类的指针(引用)转换成同一类层次结构的其它类的指针(引用)
- dynamic_cast每次执行两个操作:类型检查和类型转换,只有在类型检查正确的情况下,才进行类型转换。
- 对于类类型指针之间的转换,可以通过dynamic_cast操作符的返回值进行判断,如果转换失败会返回0,通过if判断可以查看是否转换成功。
- 对于类引用类型之间的转换,如果转换失败会抛出异常,对抛出的异常进行处理时会给程序带来相应的开销,如构造异常对象等。
dynamic_cast 被用来执行从基类指针到派生类指针的安全转换,它常常被称为安全的向下转换 downcasting。 当我们必须使用派生类的特性,而该特性又没有出现在基类中时我们常常使用 dynamic_cast, 用指向基类类型的指针来操纵派生类类型的对象,通常通过虚拟函数自动处理 。但是在某些情形下,使用虚拟函数是不可能的 。dynamic_cast 为这些情形提供了替代的机制,但是这种机制比虚拟成员函数更易出错,应该小心使用。 如果我们希望扩展某个类库,不能增加虚拟成员函数,但我们可能仍然希望增加功能,在这种情况下,就必需使用 dynamic_cast 。
下面是一个dynamic_cast使用例子
场景:我们购买了一个类库产品,该类实现计算薪水功能:假如公司有两类员工,项目经理和程序员,对于代码实现方式,我们可以定义一个基类employee,里面定义虚函数getSalary进行薪水的计算。项目经理类manager和程序员programmer继承employee实现相应的getSalary虚函数。但是由于薪资改革,需要给程序员programmer分发奖金,这样薪水的计算方式需要发生变化,直接的方法是修改基类
添加奖金的计算虚拟函数getBonus,然后所有的基类实现该函数,重新编译程序,但是该类是购买产品该方法是行不通的(实际未必如此,只是举个例子),我们可以单独为programmer类实现getBonus方法,此时需要dynamic_cast操作符,把基类指针转换成programmer指针,然后调用programmer的getBonus方法。
代码如下
#include <iostream>
using namespace std;
class employee {
public:
virtual int getSalary() = 0;
};
class manager:public employee{
public:
virtual int getSalary() {
return 700;
}
};
class programmer:public employee{
public:
virtual int getSalary() {
return 200;
}
int getBonus() {
return 300;
}
};
int get_salary(employee *pe) {
int salary = 0;
programmer *prg = dynamic_cast<programmer*>(pe);
if (prg != NULL) {
salary = prg->getSalary() + prg->getBonus();
cout<<"programmer ";
}
else {
salary = pe->getSalary();
cout<<"manager ";
}
return salary;
}
int _tmain(int argc, _TCHAR* argv[])
{
employee *prg = new programmer();
employee *pmg = new manager();
cout<<"programmer : "<<get_salary(prg)<<endl;
cout<<"mamager: "<<get_salary(pmg)<<endl;
return 0;
}
- dynamic_cast操作符的用法
- [转]dynamic_cast 的用法
- dynamic_cast的用法
- dynamic_cast的用法
- dynamic_cast的用法
- dynamic_cast操作符
- dynamic_cast 操作符
- C++ dynamic_cast操作符
- static_cast和dynamic_cast的用法
- C++中的dynamic_cast 操作符
- C++的四种操作符:static_cast,dynamic_cast,reinpreter_cast,const_cast
- dynamic_cast用法
- dynamic_cast用法
- dynamic_cast用法
- dynamic_cast 用法
- dynamic_cast<>用法
- static_cast,const_cast,dynamic_cast,reinterpret_cast的用法
- static_cast, dynamic_cast, reinpreter_cast, const_cast的用法
- 感人至深
- 解决FileZilla Server FTP服务器中文乱码问题
- mount 错误及 aix 文件共享
- 常用的正则表达式
- 体验了下人民搜索,写个体验报告
- dynamic_cast操作符的用法
- 在即时通讯领域可以和QQ抗争的产品(一)阿里巴巴:让人升值的即时通讯
- 关于“验证视图状态 MAC 失败”的解决方法
- Red hat9.0 Linux下安装libpcap库
- java Session统计在线用户,并且显示在线用户
- Why did we implement Swing in this way?(为什么Swing要这样实现呢?)
- EXCEL里如何把一列中重复的内容删除
- 配置ALTERA_FPGA
- KFS 0.5发布说明