C ++如何区分异构集合中的特定对象类型?

时间:2013-02-21 20:33:54

标签: c++ object collections polymorphism heterogeneous

所以,如果我有一个异构的Car对象集合

Car * c = {truck,van,convertible}

如果对象集合是随机的并且我想通过for循环遍历集合,我该如何测试特定的对象类型?

3 个答案:

答案 0 :(得分:6)

您可以使用dynamic_cast

if (truck* truck_p = dynamic_cast<truck*>(car_p)) {
  // car_p points at a truck
}

dynamic_cast将检查car_p指向的对象的动态类型,并且只有在truck时才允许转换。如果它不是truck,它将给出空指针值,因此if条件将失败。

然而,需要测试这样的动态类型表明代码设计不好。多态性的全部意义在于,您可以将任何派生对象视为基础对象 - 不应该确切地测试它是哪个派生类型。如果您需要检查Car的动态类型,以便可以对其执行某些truck特定操作,那么您不应该将truck放入Car*的容器中{1}}。

答案 1 :(得分:2)

如果您必须知道派生类型,则多态性不适合该作业。我建议使用boost::variant或同等效果来实现visitor pattern

答案 2 :(得分:1)

试着看RTTI:

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

这是运行时类型信息。您还可以在每个派生类型中添加一个成员变量,说明它的类型,并使用它来检查。