首页 > 代码库 > ?dynamic_caast操作符
?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 { //公有继承Employeepublic: 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 0;}
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操作符
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。