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. 如果它不是 a truck,它将给出空指针值,因此if条件将失败。

但是,需要测试这样的动态类型表明代码设计不佳。多态性的全部意义在于您可以将任何派生对象视为基础对象 - 无需准确测试它是哪种派生类型。如果您需要检查 a 的动态类型Car以便可以对其进行一些truck特定的操作,那么您不应该将其truck扔到Car*.

于 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 回答