2011-08-14 53 views
1

dynamic_cast拋出bad_cast異常,如果你投了一個引用,但正如我所知在標準指針被視爲引用,即指針是一種引用類型。
所以我應該在投射指針時得到bad_cast?轉換指向dynamic_cast的指針時拋出bad_cast?

此問題來自this page的try-catch塊。這個try-catch塊不合適嗎?

+2

你在哪裏發現「指針是一種參考類型」? –

回答

5

沒有指針,如果投射不好,dynamic_cast將返回null
此外,dynamic_cast僅適用於Polymorphic類,所以如果您正在討論內置數據類型(來自您問題中的鏈接),那麼static_cast就是您應該使用的。

而順便說一句,參考文獻是不是指針。

+1

我沒有說引用是指針,我說指針是一種引用類型。這是真的不同的thigs! – Narek

+1

沒有指針是**不是**不是一種引用,它們都是不同的**事物** –

+2

@Narek:在C++術語中,「引用」用於引用。我同意這是一個非常尷尬的術語。但爲了避免誤解,我們需要非常小心地保持舌頭(或者英語的慣用表達方式!)。 :-) –

1

至於原來的問題「所以我應該得到bad_cast鑄造指針時?」,第

這就是爲什麼你可以看到像

if(T* pT = dynamic_cast<T*>(p)) ... // use pT in if body 

關於新問題結構「這是的try-catch塊不恰當?「,不,這是一個try - catch塊來捕獲分配錯誤;這與dynamic_cast本身無關。

乾杯&心連心,

0

由於dynamic_cast<T*>不拋出異常,在try-catch塊之一是完全不必要的。

但是,您可以輕鬆定義您自己的投影函數,它確實會爲指針引發異常。這就是我在我自己的代碼正在做的(簡化代碼,請不要忘記我使用垃圾收集,所以我可以拋出指針沒有後果):

template <class Class, class Object> 
inline Class* cast (Object* obj) 
{ 
    Class* result = dynamic_cast<Class*>(obj); 
    if(obj != null and result == null){ 
     throw new ClassCastException(); // unusual, throw bad_cast if you prefer 
    } 
    return result; 
} 

template <class Class, class Object> 
inline const Class* cast (const Object* obj) 
{ 
    const Class* result = dynamic_cast<const Class*>(obj); 
    if(obj != null and result == null){ 
     throw new ClassCastException(); // unusual, throw bad_cast if you prefer 
    } 
    return result; 
} 

在一個側面說明,我也把它作爲一個語法糖爲的static_cast,但是這僅僅是可能的,因爲我不使用它的dynamic_cast引用和const引用:

template <class Class, class Object> 
inline Class cast (const Object& obj) 
{ 
    return static_cast<Class>(obj); 
} 

我說你最好實現自己鑄造的功能是一致的在異常處理方面和做正是你想要的和期望的。我做了,從不回頭。

+0

不錯,但我必須完全脫離語境。問題在於OP對'dynamic_cast'的理解是否引發了異常,S/He引用了一個特殊的例子來清除這種理解,OP不需要這種行爲。 –

相關問題