C++:识别对象的类型

标签 c++ c++11

我很好奇在当前的 C++ 和 C++11 中都可以使用哪些构造或语言功能来推断对象的类型。一个例子:

class Base {
};

class DerivA
    : public Base {
};

class DerivB
    : public Base {
};

void foo(Base* obj) {
    // Identify if `obj` is a `DerivA` or a `DerivB`
}

这是过于简单化了。看起来最好的解决方案不是有一种方法来识别类型,而是为两个派生类型重载函数并取消基类。

我的真实用例是一个类对对象的确切类型不感兴趣(即只需要 Base 的实现)而另一个类需要确切地知道 的实现是什么code>Base 第一个类正在使用。

这发生在基于组件的游戏实体系统中。基础是一个 EntityState,它的派生类型是 StandingStateDeadState 等。类 Entity 就是其中一个只需要一个通用的 EntityState 对象和类 EntityRepresentation 需要确切地知道实体处于什么状态来决定是绘制“站立”动画还是“死亡”动画,或其他。


编辑:当然,如果可能的话,我希望以这样一种方式实现游戏,即使是实体表示也不需要知道实体状态的类型。如果有办法做到这一点,那么我会使用它。 :) 我会研究访问者模式。

最佳答案

您可以为此使用dynamic_cast:

if(DerivA * derivA = dynamic_cast<DerivA*>(obj)){
    // it is a DerivA
}

关于C++:识别对象的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6442576/

相关文章:

c++ - getchar() 或 putchar() 不断吃掉我输入的第一个字符

c++ - 是否有任何 C++11 线程安全保证适用于使用 C++11 编译/链接的第三方线程库?

c++ - 来自 cppreference.com 的模板参数特化示例不起作用

c++ - std::rank 的目的是什么?

c++ - 为什么接受数组的 C++ 模板不比接受 GCC 5.3 和 Clang 4.0 的指针更专业?

c++ - 多个getline实现

c++ - C++ 标准的哪一部分涵盖通过空指针调用方法?

c++ - 在linux makefile上运行MPI程序

c++ - 如何将 const std::shared_ptr 插入 std::map

c++ - 制作嵌套类型的元组