在我的程序中,有一个名为Entity的类。另一个入侵者类继承Entity。因为我想要有4种不同的入侵者,我声明类Invader1,Invader2,Invader3和Invader4,它们继承自入侵者。现在我声明一个实体指针类型向量来存储所有入侵者,如下所示:
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());
当我在运行时检查实体中元素的类型时,比如
typeid(*entities->at(index))
它可能返回4种入侵者中的一种。在entities中还有其他继承Entity的对象。所以我只想检查对象的类型是不是入侵者,我不想知道它是Invader1,Invader2等。
我如何才能做到这一点?
发布于 2012-05-07 22:13:35
在C++中有很多方法可以做到这一点,但最根本的问题是,一旦你必须开始查询一个被认为是多态的容器中的元素,你最好放弃使用多态的想法。拥有多态元素集合的全部意义在于,您可以对它们一视同仁。因此,如果你有一个vector<Entity*>
,你应该只把它的元素当做Entity*
来处理。如果你发现你需要在Entity
上调用一些Invader
-like函数,那么你最好也持有一个Invader*
容器(使用与原始容器相同的指针)。
发布于 2012-05-07 21:55:01
您可以检查dynamic_cast<Invader*>(entities->at(index))
是否返回not NULL
(因为当指针不是指向其类派生自Invader
的对象时,它将导致NULL
指针)。
有关文档,请参阅this link。
发布于 2012-05-07 21:57:57
创建一个继承自Entity
的Invader
类。让你的Invader1
、Invader2
等类继承自Invader
。
然后,您可以添加一个virtual bool IsInvader() const;
,它在Entity
中返回false
,在Invader
中返回true
。
https://stackoverflow.com/questions/10483311
复制相似问题