【发布时间】:2017-09-16 12:44:37
【问题描述】:
假设我有一个超多态基类 Shape,其中许多其他形状类都派生自它。
现在,如果我有一个形状指针向量,其中包含一个指向不同形状类型列表的指针,如下所示:
vector<Shape*> p; // p contains pointer to many different shape objects
我知道要访问向量 p 中每个形状的方法和成员,我需要使用 dynamic_cast。
但是如果我不知道向量 p 在运行时实际包含什么怎么办?如何在运行时安全地找到向量 p 中包含的对象的类型?
我也知道我可以检查通过 dynamic_cast 进行的转换是否返回 NULL 是否成功。但这是否意味着要在向量 p 中找到我的形状对象的实际类型,我必须这样做:
if (dynamic_cast<Circle*> p[i] !=NULL){
// do stuff
}
else if (...) {
}
并为所有其他形状类型重复此模式?
但是如果我有 100 个可能的形状,这会变得很麻烦。有没有更好的方法来实现这一点?
ps- 考虑以下场景:
假设我需要遍历 Shape* 向量,例如将所有圆形对象放在单独的向量和向量等中……现在我需要知道对象的实际类型。检查返回如果许多形状的 typeid 和 dynamic_casts 是不切实际的。
【问题讨论】:
-
但我必须再次针对不同的形状类型检查 typeid。这并不能真正解决问题。
-
dynamic_cast通常是一种反模式。改用虚方法。如果您需要根据另一个对象的类型动态调度代码,请给该对象一个虚拟的visit()方法并改用visitor pattern。
标签: c++ oop polymorphism runtime