したがって、Carオブジェクトの異種コレクションがある場合
車*c= {トラック、バン、コンバーチブル}
オブジェクトのコレクションがランダムで、forループを使用してコレクションを調べたい場合、特定のオブジェクトタイプをテストするにはどうすればよいですか?
したがって、Carオブジェクトの異種コレクションがある場合
車*c= {トラック、バン、コンバーチブル}
オブジェクトのコレクションがランダムで、forループを使用してコレクションを調べたい場合、特定のオブジェクトタイプをテストするにはどうすればよいですか?
を使用しますdynamic_cast
:
if (truck* truck_p = dynamic_cast<truck*>(car_p)) {
// car_p points at a truck
}
dynamic_cast
が指しているオブジェクトの動的タイプをチェックし、car_p
それが である場合にのみキャストを許可しtruck
ます。でない場合はtruck
、null ポインター値が返されるため、if
条件は失敗します。
ただし、このような動的な型をテストする必要があるということは、コード設計が悪いことを示唆しています。ポリモーフィズムの全体的なポイントは、派生オブジェクトをベース オブジェクトであるかのように扱うことができるということです。どの派生型であったかを正確にテストする必要はありません。Car
特定の操作を実行できるように a の動的な型をチェックする必要がある場合は、それを のコンテナーにtruck
スローしないでください。truck
Car*
派生型を知る必要がある場合、ポリモーフィズムは適切なツールではありません。訪問者パターンを実装するには、 boost::variantまたは同等のものを使用することをお勧めします。
RTTIを見てみてください:
http://en.wikipedia.org/wiki/Run-time_type_information
ランタイム型情報です。また、どの型であるかを示すメンバー変数を各派生型に追加し、それを使用して確認することもできます。