動的キャストを行う場合:
A* x = ...;
B* b = dynamic_cast<B*>(x);
dynamic_cast は、次の場合にのみ有効なポインターを返します。
- A はポリモーフィックです。それ以外の場合、コンパイルは失敗します。
B は A と同等であるか、A から派生しています。B は継承階層で A と関係を持つ必要があります (戦略についてはよくわかりませんが)。それ以外の場合は nullptr を返します。これはコメントに従って更新されます。- *x の RTTI は、それがクラス B のオブジェクトまたは B の派生クラスであることを示します。それ以外の場合は nullptr を返します。
条件 2 を除いて、条件 1 と条件 3 の両方が満たされる場合を考えています。これは、メモリ コピーまたは reinterpret_cast などによって可能になる可能性があります。以下のすべての議論は、このシナリオに基づいています。
ちょっとした例がここにあります: http://ideone.com/tBctgT
私はそれを言うことができます: そのような状況で C++ が dynamic_cast の成功を許可した場合、dynamic_cast によって返されるポインターを使用しても安全でしょうか? もしそうなら、なぜ C++ 標準は条件 2 の検証が必須であると判断するのですか?
さらに、条件 2 はコンパイル時に調べることができます。C++ 標準が、適切な操作と見なされない場合、コンパイル エラーを発生させる代わりに、実行時に nullptr を返すことを決定するのはなぜですか?