2011-07-28 11 views

答えて

1

通常のCスタイルの型キャストとは異なり、型の安全性チェックが実行時に行われ、型は互換性がない場合(参考文献を扱うとき)、例外がスローされますNULLポインターが返されます(ポインターを扱う場合)。

http://en.wikipedia.org/wiki/Dynamic_cast

+1

これは厳密には当てはまりません。彼がやっているように、派生から基本にキャストするとき、コンパイラはほぼ確実に 'dynamic_cast'と' static_cast'を同じ​​ように扱います。ランタイムチェックが行われる唯一の時間(実行時に 'dynamic_cast'が失敗する唯一の時間)は、' Base * 'から派生クラスに逆方向にキャストするときです。 –

+0

ありがとう、私はそれを知っていません。 – azat

3

両方のキャストが失敗する可能性があるため、どちらの場合でも必須ではありません。派生から基本クラスへのキャストは常に有効であり、キャストは必要ありません。

ただし、ベースクラスのポインタ(または参照)から派生クラスのポインタ(または参照)へのキャストは失敗する可能性があります。実際のインスタンスがキャストされているクラスでない場合は失敗します。このような場合には、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); 
3

のdynamic_castは、多重継承の場合には「ダウンキャスト」と「クロスキャスト」するために使用することができます。

例dynamic_castをいくつか有効では下のリンクで見つけることができます:

http://msdn.microsoft.com/en-us/library/cby9kycs%28v=vs.71%29.aspx

しかしdyanmic_castは、頻繁に使用すべきではない、あなたが遠かったのdynamic_cast、代わりに、多型がすべき使用を避けるために良いデザインを使用しようとする必要がありますdynamic_castではなくuのために働きます。

関連する問題