所以,如果我有一个异构的Car对象集合
Car * c = {truck,van,convertible}
如果对象集合是随机的并且我想通过for循环遍历集合,我该如何测试特定的对象类型?
答案 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
这是运行时类型信息。您还可以在每个派生类型中添加一个成员变量,说明它的类型,并使用它来检查。