因此,如果我有 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
. 如果它不是 a truck
,它将给出空指针值,因此if
条件将失败。
但是,需要测试这样的动态类型表明代码设计不佳。多态性的全部意义在于您可以将任何派生对象视为基础对象 - 无需准确测试它是哪种派生类型。如果您需要检查 a 的动态类型Car
以便可以对其进行一些truck
特定的操作,那么您不应该将其truck
扔到Car*
.
如果您必须知道派生类型,那么多态性就不是适合这项工作的工具。我建议使用boost::variant或等效的来实现访问者模式。
尝试查看 RTTI:
http://en.wikipedia.org/wiki/Run-time_type_information
它是运行时类型信息。您还可以在每个派生类型中添加一个成员变量,说明它是什么类型,并使用它来检查。