2017-05-26 1 views
-1
#include <iostream> 
using namespace std; 

struct A 
{ 
    virtual void foo() { } 
}; 
struct B1 :A 
{ 
}; 

int main() 
{ 
    int x = 42; 
    A *a = (A*)&x; 
    try 
    { 
     B1 *b = dynamic_cast<B1*>(a); 
    } 
    catch (...) 
    { 
     cout << "what kind of exception is here now?"; 
    } 
    return 0; 
} 

私はどのような例外をキャッチしますか?dynamic_castポインタ例外キャッチ

これ以外に、かっこで書くことができます:catch(...)もこの例外をキャッチしますか?

+2

ポインタを使った 'dynamic_cast'は例外をスローしません。失敗した場合は' nullptr'を返します。 –

+3

'A * a =(A *)&x;'これは無効です。 – Jarod42

+1

このコードはナンセンスです。それをしないでください。 –

答えて

2

dynamic_castポインタタイプ間のポインタは決して投げません。それは単にnullptrを返します。 dynamic_castをスローするには、参照型の間で変換します。例外はタイプstd::bad_castです。

http://en.cppreference.com/w/cpp/language/dynamic_castから:

キャストが失敗し、new_typeはポインタ型である場合、それはその型のNULLポインタを返します。キャストが失敗し、new_typeが参照型の場合は、std :: bad_cast型のハンドラに一致する例外がスローされます。