0

したがって、Carオブジェクトの異種コレクションがある場合

車*c= {トラック、バン、コンバーチブル}

オブジェクトのコレクションがランダムで、forループを使用してコレクションを調べたい場合、特定のオブジェクトタイプをテストするにはどうすればよいですか?

4

3 に答える 3

6

を使用します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スローしないでください。truckCar*

于 2013-02-21T20:36:13.577 に答える
2

派生型を知る必要がある場合、ポリモーフィズムは適切なツールではありません。訪問者パターンを実装するには、 boost::variantまたは同等のものを使用することをお勧めします。

于 2013-02-21T20:50:31.587 に答える
1

RTTIを見てみてください:

http://en.wikipedia.org/wiki/Run-time_type_information

ランタイム型情報です。また、どの型であるかを示すメンバー変数を各派生型に追加し、それを使用して確認することもできます。

于 2013-02-21T20:39:35.527 に答える