4

例を挙げて、static_cast よりも dynamic_cast を使用する必要がある場合、または使用する必要がある場合を知りたいです。この SO questionを読みましたが、具体的な例は実際には提供されていません。私は、ほとんどの例にポリモーフィックなクラス型が含まれていると想定しています。現在、 static_cast よりも dynamic_cast を使用することを知っている唯一の理由は、使用している具体的な型を 100% 確信していない場合です。

その他の考え:

  • 横向きのキャスト (多重継承)
  • 仮想継承階層の基本クラスへのキャスト
  • 多重継承を使用するクラスで「最も右側」の継承された型にキャストすると、ポインターは変更されますか (static_cast を使用する場合)。

「タイプがわからない場合」の理由は唯一の理由ですか?そうでない場合、誰かが static_cast よりも dynamic_cast を使用する必要がある、または使用する必要がある理由を示す例を提供できますか?

4

2 に答える 2

2

一般にdynamic_cast、関係なく、階層内で変換するときに使用する必要があります。考えられる例外の 1 つは、派生クラスからベース (もちろんポインターまたは参照) に変換する場合です。それ以外の場合、static_cast階層内で使用するのは、プロファイラーが必要だと言ったときだけです。

static_castvoid*との間で変換する場合、またはヌル ポインター定数の正しい型を保証する場合、またはポインターや参照を含まない変換 (例: ) の場合に、より頻繁に使用されますstatic_cast<double>( someInt )

于 2012-10-01T16:37:08.710 に答える
0

dynamic_cast動的型がわかっている場合でも使用する必要がある状況の 1 つは、仮想ベースからより派生した型にキャストする場合です。

struct A { };
struct B : virtual A { };
struct C : virtual A { };
struct D : B, C { };

A * p = new D;
D * q = dynamic_cast<D*>(p);

その理由はもちろん、仮想ベースが実行時にのみ決定されるためです。

のもう 1 つの用途は、にキャストしdynamic_castて最も派生したオブジェクトのアドレスを検出することですが、それが必要な言語機能であるかどうかは完全には明らかではありません。(私はユースケースを考案することができましたが、それはほとんどアカデミックです。)void*

于 2012-10-01T16:47:41.123 に答える