重複の可能性:
FAQ:クラスに少なくとも1つの仮想メソッドがある場合にのみdynamic_castが機能するのはなぜですか?
C ++では、クラスのセットの階層を下って動的キャストを実行すると、基本クラスが仮想関数を持っている場合など、クラスがポリモーフィックである状況でのみキャストが許可されることを読みました。この制限の理由は?基本クラスの通常の仮想関数の代わりに純粋仮想関数を使用する方が「安全」ですか?
ありがとう!
重複の可能性:
FAQ:クラスに少なくとも1つの仮想メソッドがある場合にのみdynamic_castが機能するのはなぜですか?
C ++では、クラスのセットの階層を下って動的キャストを実行すると、基本クラスが仮想関数を持っている場合など、クラスがポリモーフィックである状況でのみキャストが許可されることを読みました。この制限の理由は?基本クラスの通常の仮想関数の代わりに純粋仮想関数を使用する方が「安全」ですか?
ありがとう!
この制限の理由は何ですか?
dynamic_cast
オブジェクトがターゲットタイプのインスタンスである場合にのみ成功することになっています。非ポリモーフィッククラスには型情報が含まれていないため、これが当てはまるかどうかを判断する方法はありません。したがって、キャストは成功できません。
基本クラスの通常の仮想関数の代わりに純粋仮想関数を使用する方が「安全」ですか?
ポリモーフィズムに関する限り、どちらでも構いません。基本クラスに少なくとも1つの仮想関数がある場合、それはポリモーフィックであるため、で使用できますdynamic_cast
。純粋であるかどうかは、基本クラスをインスタンス化できるかどうかに影響するだけです。
実行dynamic_cast
時に実行時に型チェックが実行されstd::bad_cast
、キャストが不正な場合は例外がスローされるか、nullポインタが返されます。これを可能にするメカニズムはRTTIと呼ばれます。
クラスがポリモーフィックでない場合、実行時に型情報が格納されないため、その型チェックを実行する方法はありません。
これは、標準によって引き起こされる制限です。
主要な実装では、2つのクラスの-仮想関数テーブルポインタ-をdynamic_cast
比較することによって機能します。vfptr
これは、実行時にクラスが関連しているかどうかを判断する1つの方法です。dynamic_cast
その上、非多形クラスで行うことは実際には意味がありません。そのstatic_cast
ためにあります。
dynamic_cast
非ポリモーフィッククラスで使用しようとしている場合、あなたは何か間違ったことをしていると思います。コードを投稿していただければ、サポートさせていただきます。