?dynamic_caast操作符
阿新 • • 發佈:2017-05-09
目標 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: voidPaySalary() 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操作符