C++中的dynamic_cast和dynamic_pointer_cast
賈作真時真亦賈 2019-08-02 16:23:16 3451 收藏 1
展開
dynamic_cast:
將一個基類對象指針(或引用)cast到繼承類指針,dynamic_cast會根據基類指針是否真正指向繼承類指針來做相應處理。
主要用途:將基類的指針或引用安全地轉換成派生類的指針或引用,並用派生類的指針或引用調用非虛函數。如果是基類指針或引用調用的是虛函數無需轉換就能在運行時調用派生類的虛函數。
轉換方式:
dynamic_cast< type* >(e)
type必須是一個類類型且必須是一個有效的指針
dynamic_cast< type& >(e)
type必須是一個類類型且必須是一個左值
dynamic_cast< type&& >(e)
type必須是一個類類型且必須是一個右值
e的類型必須符合以下三個條件中的任何一個:
1、e的類型是目標類型type的公有派生類
2、e的類型是目標type的共有基類
3、e的類型就是目標type的類型。
一、指針類型的dynamic_cast
如果一條dynamic_cast語句的轉換目標是指針類型並且轉換失敗了,會返回一個空指針,則判斷條件為0,即為false;如果轉換成功,指針為非空,則判斷條件為非零,即true。
二、引用類型的dynamic_cast
引用類型的dynamic_cast和指針類型的dynamic_cast在表示錯誤發生的方式上略有不同。因為不存在空引用,所以對於引用類型來說無法使用與指針類型完全相同的錯誤報告策略。當對引用類型轉換失敗時,程序拋出一個名為std::bad_cast的異常,該異常定義在typeinfo標准庫頭文件中。
dynamic_pointer_cast
dynamic_pointer_cast與dynamic_cast用法類似,當指針是智能指針時候,向下轉換,用dynamic_Cast 則編譯不能通過,此時需要使用dynamic_pointer_cast。智能指針的用法可以參考上一篇博客。
————————————————
版權聲明:本文為CSDN博主「賈作真時真亦賈」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/jiayizhenzhenyijia/java/article/details/98209529
基類:

公有派生類: IndexIntArray 是SafeIntArray的公有派生類

