原文
主題c++
dynamic_cast是四個強制型別轉換操作符中最特殊的乙個,它支援執行時識別指標或引用。
>>>>>>>>>>>編譯器的rtti設定》
dynamic_cast提供rtti(run-time type information),也就是執行時型別識別。它對編譯器有要求,需要編譯器啟動「執行時型別資訊」這一選項。當編譯器不開啟rtti時,執行含有dynamic_cast操作符的程式時會出現乙個警告:
warning c4541: 「dynamic_cast」用在了帶 /gr- 的多型型別「animal」上;可能導致不可預知的行為
vs2010在預設下是開啟rtti的,也可以自己手動去開啟或者關閉,操作如下:
檢視->解決方案資源管理器
在開啟的解決方案管理器中,對著專案名稱右擊,選擇屬性
配置屬性-〉c/c++
>>>>>>>>>>>>>>>>>步入正題》
dynamic_cast用於類繼承層次間的指標或引用轉換。主要還是用於執行「安全的向下轉型(safe downcasting)」,也即是基類物件的指標或引用轉換為同一繼承層次的其他指標或引用。至於「先上轉型」(即派生類指標或引用型別轉換為其基類型別),本身就是安全的,儘管可以使用dynamic_cast進行轉換,但這是沒必要的, 普通的轉換已經可以達到目的,畢竟使用dynamic_cast是需要開銷的。
1對於「向下轉型」有兩種情況。一種是基類指標所指物件是派生類型別的,這種轉換是安全的;另一種是基類指標所指物件為基類型別,在這種情況下dynamic_cast在執行時做檢查,轉換失敗,返回結果為0;class
base2 ;
5 virtual
void
show()
6 };
7 class
derived:public
base8 ;
11 void
show()
12 };
13 int
main()
14
#include "
stdafx.h
"#include
using
namespace
std;
class
base
;virtual
void
show()
};class
derived:public
base
;void
show()
};int
main()
//這是第二種情況
base * base1 = new
base;
if(derived *der1 = dynamic_cast
(base1))
else
delete
(base);
delete
(base1);
system("
pause");
}
執行結果:
在前面的例子中,使用了dynamic_cast將基類指標轉換為派生類指標,也可以使用dynamic_cast將基類引用轉換為派生類引用。
同樣的,引用的向上轉換總是安全的:
derived c;
derived & der2= c;
base & base2= dynamic_cast
(der2);//
向上轉換,安全
base2.show();
所以,在引用上,dynamic_cast依舊是常用於「安全的向下轉型」。與指標一樣,引用的向下轉型也可以分為兩種情況,與指標不同的是,並不存在空引用,所以引用的dynamic_cast檢測失敗時會丟擲乙個bad_cast異常:
int
main()
catch
(bad_cast)
system("
pause");
}
執行結果:
當乙個類中擁有至少乙個虛函式的時候,編譯器會為該類構建出乙個虛函式表(virtual method table),虛函式表記錄了虛函式的位址。如果該類派生了其他子類,且子類定義並實現了基類的虛函式,那麼虛函式表會將該函式指向新的位址。虛表是c++多型實現的乙個重要手段,也是dynamic_cast操作符轉換能夠進行的前提條件。當類沒有虛函式表的時候(也即乙個虛函式都沒有定義),dynamic_cast無法使用rtti,不能通過編譯( 個人猜想...有待驗證 )。
當然,虛函式表的建立對效率是有一定影響的,構建虛函式表、由表查詢函式 都需要時間和空間上的消耗。所以,除了必須宣告virtual(對於乙個多型基類而言),不要輕易使用virtual函式。對於虛函式的進一步了解,可以檢視《effective c++》
條款07:為多型基類宣告virtual析構函式。
強制型別轉換操作符
操作符 中文名稱 含義 dynamic cast 動態型別轉換符 支援多型而存在,主要用於類之間的轉換 static cast 靜態型別轉換符 僅僅完成編譯時期的轉換檢查 reinterpret cast 再解釋型別轉換符 完成不同型別指標之間的相互轉換 const cast 常型別轉換符 用來修改...
C 強制型別轉換操作符 dynamic cast
dynamic cast是四個強制型別轉換操作符中最特殊的乙個,它支援執行時識別指標或引用。編譯器的rtti設定 dynamic cast提供rtti run time type information 也就是執行時型別識別。它對編譯器有要求,需要編譯器啟動 執行時型別資訊 這一選項。當編譯器不開啟...
C 強制型別轉換操作符 static cast
static cast是乙個強制型別轉換操作符。強制型別轉換,也稱為顯式轉換,c 中強制型別轉換操作符有static cast dynamic cast const cast reinterpert cast四個。本節介紹static cast操作符。double a 1.999 int b sta...