dynamic_cast
とは動作が異なりstatic_cast
ます。a の結果static_cast
は常にポインターです。ただし、キャストが正しくない場合 (指定されたポインターが元の型ではなかった場合)、キャストの結果は未定義です。ポインタは必ずしも有効ではありません。static_cast
したがって、 ;を使用して派生クラスにキャストする場合、ある程度の不確実性があります。間違ったものにキャストするのを防ぐメカニズムはありません。
dynamic_cast
キャストが正しい場合は有効なポインターを返し、正しくない場合は null ポインターを返します。したがって、結果はすべてのケースで明確に定義されています。これを行うには、動的dynamic_cast
でなければなりません。これは、キャスト先の型が正当なキャスト操作であるかどうかを確認するために、ポインターに対してランタイム チェックを実行する必要があることを意味します。
C++ は、「使用した分だけ支払う」という原則により、非仮想型のキャストを禁止しています。仮想関数を持たない型は、通常、その基底クラスによって渡される型ではありません。仮想を使用しない継承は、主に既存の実装を使用することであり、関数を特殊化することではありません。仮想デストラクタのような単純なものでも十分です。
必要な機械dynamic_cast
はゼロではありません。そのため、「使用した分だけ支払う」という原則の下で、有用なクラスだけが料金を支払います。IE: 仮想のクラス。