可能性の重複:
dynamic_cast in c++
dynamic_castはいつ必要ですか?
基本クラスのポインタに派生クラスを割り当てるのこれら二つの方法の違いは何ですか?ウィキペディアから
Derived d1;
Base *b1 = &d1
Derived d2;
Base *b2 = dynamic_cast<Base*> &d2
可能性の重複:
dynamic_cast in c++
dynamic_castはいつ必要ですか?
基本クラスのポインタに派生クラスを割り当てるのこれら二つの方法の違いは何ですか?ウィキペディアから
Derived d1;
Base *b1 = &d1
Derived d2;
Base *b2 = dynamic_cast<Base*> &d2
:
通常のCスタイルの型キャストとは異なり、型の安全性チェックが実行時に行われ、型は互換性がない場合(参考文献を扱うとき)、例外がスローされますNULLポインターが返されます(ポインターを扱う場合)。
最初のものはstatic_castをある明示的な変換です。相違点については、http://www.cplusplus.com/doc/tutorial/typecasting/
両方のキャストが失敗する可能性があるため、どちらの場合でも必須ではありません。派生から基本クラスへのキャストは常に有効であり、キャストは必要ありません。
ただし、ベースクラスのポインタ(または参照)から派生クラスのポインタ(または参照)へのキャストは失敗する可能性があります。実際のインスタンスがキャストされているクラスでない場合は失敗します。このような場合には、dynamic_cast
が適切である:
Derived d1;
Base* b = &d1; // This cast is implicit
// But this one might fail and does require a dynamic cast
Derived* d2 = dynamic_cast<Derived*> (b); // d2 == &d1
OtherDerived d3; // Now this also derives from Base, but not from Derived
b = &d3; // This is implicit again
// This isn't actually a Derived instance now, so d3 will be NULL
Derived* d3 = dynamic_cast<Derived*> (b);
のdynamic_castは、多重継承の場合には「ダウンキャスト」と「クロスキャスト」するために使用することができます。
例dynamic_castをいくつか有効では下のリンクで見つけることができます:
http://msdn.microsoft.com/en-us/library/cby9kycs%28v=vs.71%29.aspx
しかしdyanmic_castは、頻繁に使用すべきではない、あなたが遠かったのdynamic_cast、代わりに、多型がすべき使用を避けるために良いデザインを使用しようとする必要がありますdynamic_castではなくuのために働きます。
これは厳密には当てはまりません。彼がやっているように、派生から基本にキャストするとき、コンパイラはほぼ確実に 'dynamic_cast'と' static_cast'を同じように扱います。ランタイムチェックが行われる唯一の時間(実行時に 'dynamic_cast'が失敗する唯一の時間)は、' Base * 'から派生クラスに逆方向にキャストするときです。 –
ありがとう、私はそれを知っていません。 – azat