Rap*_*pti 1 c++ inheritance instanceof
我正在用C++创建一个2D游戏,它使用了由瓷砖制成的等级.世界级具有add(WorldObject* o)可以接受瓦片或诸如敌人的实体的功能.这个Tile和Entity类都来自WorldObject.在每种情况下,都应将对象添加到entities列表中; 但如果它是一个图块,它也应该添加到tiles列表中.
World.h
class World {
private:
list<WorldObject*> content;
list<Tile*> tiles;
public:
void add(WorldObject*);
}
Run Code Online (Sandbox Code Playgroud)
World.cpp
void World::add(WorldObject* o) {
content.push_back(o);
if(*o instanceof Tile) //What do I need to put here?
tiles.push_back(o);
}
Run Code Online (Sandbox Code Playgroud)
如何检查对象在C++中是否具有特定类型?这与类型转换和虚函数以及类似的东西无关,因为我不想在此时调用对象的函数; 如果它有某种类型,我只需要将它添加到一个单独的列表中.在Java中,我可以做到if(instance instanceof Class).我怎么能用C++做到这一点?
Bar*_*rry 11
A dynamic_cast会检查你是否可以向下o转Tile.如果可以,它将返回一个有效的Tile*,否则它将返回一个null Tile*:
void World::add(WorldObject* o) {
content.push_back(o);
if (Tile* t = dynamic_cast<Tile*>(o)) {
tiles.push_back(t);
}
}
Run Code Online (Sandbox Code Playgroud)
如果对象是多态的,即至少有一个virtual函数成员,您只能在运行时推断该对象的动态类型。一个virtual析构函数也会做这件事情。(实际上,如果什么都没有,谈论“动态类型”并没有多大意义virtual。)
然后你可以尝试 adynamic_cast作为instanceof等价物。你会写的地方
void f(Base base) {
if (base instanceof Derived) {
Derived derived = (Derived) base;
// use derived
}
}
Run Code Online (Sandbox Code Playgroud)
在 Java 中,你会写
void
f(Base& base)
{
if (Derived * derived_ptr = dynamic_cast<Derived *>(&base))
{
// use derived_ptr
}
}
Run Code Online (Sandbox Code Playgroud)
在 C++ 中。如果对象的类型不正确,则dynamic_cast指向指针类型的A将简单地返回 a nullptr(其计算结果为false),因此通常在 if. dynamic_cast但是,对引用的A会引发异常,因此只有在确定对象实际上属于该类型时才应使用它。
我应该补充一点,C++ 示例只有在Derived实际派生自Base. 否则,无论如何检查都将毫无意义。但是请注意,您无法通过void *指针恢复对象的类型。如果您考虑一下,这是有道理的,因为这void *实际上可能指向一个随机的字节集合,而该集合没有任何可从中提取类型的内容。