假设我有一个 super 多态基类 Shape,其中许多其他形状类都派生自它。
现在,如果我有一个形状指针 vector ,其中包含一个指向不同形状类型列表的指针,如下所示:
vector<Shape*> p; // p contains pointer to many different shape objects
我知道要访问 vector p 中每个形状的方法和成员,我需要使用 dynamic_cast。
但是如果我不知道运行时 p 实际包含什么 vector 怎么办?我如何在运行时安全地找到 vector p 中包含的对象的类型?
我也知道我可以检查 dynamic_cast 的转换是否成功返回 NULL。但这是否意味着要在 vector p 中找到我的形状对象的实际类型我必须做这样的事情:
if (dynamic_cast<Circle*> p[i] !=NULL){
// do stuff
}
else if (...) {
}
并为所有其他形状类型重复此模式?
但是如果我有 100 种可能的形状,这会变得很麻烦。在 rumtime 有没有更好的方法来实现这一目标?
ps- 考虑以下场景:
假设我需要遍历 Shape* vector ,例如将所有圆形对象放在一个单独的 vector 和 vector 中等等……现在我需要知道对象的实际类型。如果许多形状的 typeid 和 dynamic_casts 不切实际,则检查返回值。
最佳答案
您可以在 typeinfo
header 中使用 typeid
。
例如这个问题:How to determine actual object type at runtime in C++;
然而,实际的问题是“为什么你需要知道你的对象的实际类型?”:据我所知,这并不是经常需要这样的功能,因为多态性已经允许管理绝大多数用例.
I know to have access to methods and members of each shape in vector p, I need to use dynamic_cast.
不,不一定!
在你的情况下,也许以下就足够了,假设 Shape
有一个 area
方法,(重新)定义在 Circle
和 Rectangle
(他们都扩展了 Shape
类):
std::vector<Shape*> shapes;
Rectangle rect(...);
Circle circle(...);
shapes.push_back( &rect );
shapes.push_back( &circle );
shapes[0]->area(); // --> calls Rectangle::area()
shapes[1]->area(); // --> calls Circle::area()
关于c++ - 如何找到包含在多态基类 vector 中的对象的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46254052/