2017-04-09 105 views
1

從基類對象做向下轉換時拋出我仍然不知道爲什麼下面給出std::bad_cast例外bad_cast異常參考派生類對象

#include <typeinfo> 
class A {virtual void fun() {}}; 
class B : public A {}; 
int main() { 
    try { 
     A a; 
     B b = dynamic_cast<B&>(a); 
    } catch (std::bad_cast& e) { 
     std::cerr << e.what() << '\n'; 
    } 
} 

A是一個多態類 類B是公開從A 衍生通過引用正確地從基類A對象中進行降級,dynamic_cast確實接受引用參數 ,但仍然會出現此異常?

+2

您是否期望轉換操作符返回對有效B對象的引用?它在哪裏可以找到一個? –

+1

'A''不是'B',所以演員失敗是正確的行爲。 – dasblinkenlight

+1

如果您不想要異常,則將其轉換爲指針而不是引用,然後檢查針對nullptr的返回值以查看轉換是否成功。 – xaxxon

回答

3

這是dynamic_cast應該做的。 a實際上是A的一個對象,將其轉換爲派生類B將會失敗。另一方面,如果您將某些引用類型或指針轉換爲基類,但實際上引用了B的對象,那麼它將正常工作。例如

B b1; 
A& ra = b1; 
B b2 = dynamic_cast<B&>(ra); 
2

你基本上說的是「我有一隻動物,但它是一隻獅子嗎?」

語言需要能夠說「是的,它是一隻獅子」或「不,它不是獅子」。

當你施放一個指針類型,它可以說「不」的,如果「是」

但是,有沒有這樣的事,作爲一個空引用返回nullptr對您或實際指針獅子。因此,當你參考一個參考時,它需要一個不同的機制來通知你,你的動物不是獅子。在這種情況下,它拋出一個糟糕的強制轉換異常。