首页 > 代码库 > ?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操作符