c++ - 如何找到包含在多态基类 vector 中的对象的类型?

标签 c++ oop polymorphism runtime

假设我有一个 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 方法,(重新)定义在 CircleRectangle(他们都扩展了 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/

相关文章:

c++ - 在不同 block 之间使用 C++ 类对象

php - 一个类有多少个静态方法太多了?

java - 如何使用多态性将对象映射到辅助类?

Python Child 不能使用 Parent 导入的模块

c++ - 从每列具有不同数量值的文件中读取值,C++

c++ - 如何控制两个线程访问同一个共享数据的执行顺序

language-agnostic - 是否有一个应该设置传递对象的属性的方法的命名约定

c++ - 从 vector C++ 添加 int 元素时出错

c++ - 我们可以只为某些数据类型定义模板函数吗?

C++ 编译时多态性