1

動的キャストを行う場合:

A* x = ...;
B* b = dynamic_cast<B*>(x);

dynamic_cast は、次の場合にのみ有効なポインターを返します。

  1. A はポリモーフィックです。それ以外の場合、コンパイルは失敗します。
  2. B は A と同等であるか、A から派生しています。B は継承階層で A と関係を持つ必要があります (戦略についてはよくわかりませんが)。それ以外の場合は nullptr を返します。これはコメントに従って更新されます。
  3. *x の RTTI は、それがクラス B のオブジェクトまたは B の派生クラスであることを示します。それ以外の場合は nullptr を返します。

条件 2 を除いて、条件 1 と条件 3 の両方が満たされる場合を考えています。これは、メモリ コピーまたは reinterpret_cast などによって可能になる可能性があります。以下のすべての議論は、このシナリオに基づいています。

ちょっとした例がここにあります: http://ideone.com/tBctgT

私はそれを言うことができます: そのような状況で C++ が dynamic_cast の成功を許可した場合、dynamic_cast によって返されるポインターを使用しても安全でしょうか? もしそうなら、なぜ C++ 標準は条件 2 の検証が必須であると判断するのですか?

さらに、条件 2 はコンパイル時に調べることができます。C++ 標準が、適切な操作と見なされない場合、コンパイル エラーを発生させる代わりに、実行時に nullptr を返すことを決定するのはなぜですか?

4

1 に答える 1

1

ここでの例が最も簡単だと思います:

class A { ... };
class B : public A { ... };
class C : public A { ... };

A *x = new C;
B *y = dynamic_cast<B *>(x);

ポイント1。

A はクラスであり、ポリモーフィックです。

ポイント2。

B は A から派生し、タイプが であるため、dynamic_cast<>()はコンパイル時に許可されます。xA *

ポイント3。

タイプ B (または B から派生したクラス) のオブジェクトを表していないため、 は null を返します。そのため、コードは実行時に失敗し、 を取得しdynamic_cast<>()ます。xy == nullptr

于 2014-05-25T05:34:33.047 に答える