1. 程式人生 > >?dynamic_caast操作符

?dynamic_caast操作符

目標 const manager 子類 結果 virt mic 指針 out

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 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操作符