首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检查派生类的类型

检查派生类的类型
EN

Stack Overflow用户
提问于 2012-05-07 21:51:11
回答 4查看 2K关注 0票数 4

在我的程序中,有一个名为Entity的类。另一个入侵者类继承Entity。因为我想要有4种不同的入侵者,我声明类Invader1,Invader2,Invader3和Invader4,它们继承自入侵者。现在我声明一个实体指针类型向量来存储所有入侵者,如下所示:

代码语言:javascript
运行
复制
entities.push_back(new Invader4());
entities.push_back(new Invader3());
entities.push_back(new Invader2());
entities.push_back(new Invader1());
entities.push_back(new Invader0());

当我在运行时检查实体中元素的类型时,比如

代码语言:javascript
运行
复制
typeid(*entities->at(index)) 

它可能返回4种入侵者中的一种。在entities中还有其他继承Entity的对象。所以我只想检查对象的类型是不是入侵者,我不想知道它是Invader1,Invader2等。

我如何才能做到这一点?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-05-07 22:13:35

在C++中有很多方法可以做到这一点,但最根本的问题是,一旦你必须开始查询一个被认为是多态的容器中的元素,你最好放弃使用多态的想法。拥有多态元素集合的全部意义在于,您可以对它们一视同仁。因此,如果你有一个vector<Entity*>,你应该只把它的元素当做Entity*来处理。如果你发现你需要在Entity上调用一些Invader-like函数,那么你最好也持有一个Invader*容器(使用与原始容器相同的指针)。

票数 6
EN

Stack Overflow用户

发布于 2012-05-07 21:55:01

您可以检查dynamic_cast<Invader*>(entities->at(index))是否返回not NULL (因为当指针不是指向其类派生自Invader的对象时,它将导致NULL指针)。

有关文档,请参阅this link

票数 3
EN

Stack Overflow用户

发布于 2012-05-07 21:57:57

创建一个继承自EntityInvader类。让你的Invader1Invader2等类继承自Invader

然后,您可以添加一个virtual bool IsInvader() const;,它在Entity中返回false,在Invader中返回true

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10483311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档