2016-08-29 5 views
1

dynamic_castの例外処理を使用しているときに問題が発生しました。常にbad_castを返していません。その後、bad_castは常にdynamic_castからスローされません

derived d1 = dynamic_cast <derived &> (base); 

d1nullptrを返されて、私は次の文をしようとした場合、コンパイラは

derived *d1 = dynamic_cast <derived *> (&base); 

を警告私を示したがされているが

以下の文は、bad_cast私を投げないですstd :: bad_castをスローします

私は論理に何かを見逃していますか?クラスは多型です。

+2

[この 'dynamic_cast'リファレンス](http://en.cppreference.com/w/cpp/language/dynamic_cast)から:"キャストが失敗し、new_typeがポインタ型の場合、そのポインタはnullポインタを返しますタイプ。キャストが失敗し、new_typeが参照型の場合は、std :: bad_cast型のハンドラに一致する例外がスローされます。 –

+0

この点は私が が見つからないことを示しています。 –

+2

マニュアルを読むのと同じくらい離れているだけです... ;-) –

答えて

3

このように定義されています。

キャストする新しい型がポインタの場合、結果はエラー時にnullptrになります。 参照の場合、例外がスローされます。キャストは型new_typeの値を返すのdynamic_cast、成功した場合

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

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

1

これは、予想される動作のdynamic_castです。

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

2

既に回答したように、これは定義された動作です。

この背後にあるロジックは、開発者がプロ​​グラムにポインタを別の型ポインタに変換するよう要求すると、有効なエラーの結果としてnullを返すことができます。

ですが、参照はできません。 "null参照"のようなものはなく、 "デフォルト参照"を構築してdynamic_cast( "out"パラメータとして)を参照して渡すこともできません。基本的に、参照を別の型の参照に変換できない場合は、例外をスローする以外のことはあまりありません。他の "失敗テクニック"(例えば、boolを返す、エラーコード、ヌルポインターなど)は参照では使用できません。

私は自分の作品にdynamic_castを使用しましたが、私はそれを全く誇りに思いません。私のために、dynamic_castの使用はある種の防御プログラミングでした。通常、ポインタや基本クラスへの参照を保持している場合、仮想関数を使用して派生クラスの動作を処理し、手動でケーシングの痛みを明示的に処理する方が理にかなっています。

+0

詳細な回答がありがたくありがとうございました。私は単純にコーディングしていましたが、この問題は深刻なものでした。 –

関連する問題