我想確定一個T *指針指向的對象是否真的是一個T對象或其他一些不相關的類型。我想dynamic_cast的,但它是小於沒用,它返回指針本身,而不是零,即使很明顯它並不指向有效的T類型的對象:dynamic_cast到相同類型不檢查對象的類型
Object* garbage = reinterpret_cast<Object*>(0x12345678);
if(dynamic_cast<Object*>(garbage) == NULL){
cout << "Expected behaviour (by me)" << endl;
}else{
cout << "You've got to be kidding me" << endl;
}
對此有什麼解決辦法,或一些其他方案?我試圖在void dynamic_cast之前void *和char *無效,typeid是不夠的,因爲我也想接受子類。一些上下文:我正在寫一個自定義數組類,實現不同種類的數組之間的淺轉換,如Array<Object*>
和Array<String*>
,我希望通過在每個元素訪問時進行動態類型檢查來保證最小的類型安全性,例如:
#define DEBUG
Array<String*> v(10);
Array<Object*> o = v;
o[0] = new Integer(1); // this is technically illegal but no idea how to check
//Array<String*> w = o; // this fails with an exception
String* str = v[0]; // but this should fail horribly as well
cout << str << endl;
鑄造到對象*,然後做類型檢查的對象*在很多情況下工作,但它在Array<Object*>
的情況下失敗,但我不知道是否有可能在不使用reinterpret_cast的情況下將非對象插入Array<Object*>
。
什麼是字符串對象和整數?爲什麼你的'String * str = v [0];'行失敗? 'v [0]'是一個'String *',所以複製是完全有效的。 –
我已經在代碼中加入了一些說明。對象是String和Integer的(公共的,非虛擬的)基礎,它們都是多態的,至少有一個虛擬析構函數。對象從NonCopyable私有派生;字符串和整數從一些「接口」公開和虛擬地派生出來,但我懷疑這起到了作用。 我正在實現T * Array :: operator []以包含必要的類型檢查,以確保當我遇到dynamic_cast的奇怪行爲時它返回一個有效對象(或null)。 –
Frigo