【问题标题】:C++ get type of objectC++ 获取对象类型
【发布时间】:2011-10-27 09:22:30
【问题描述】:

我有一个具有以下类的 C++ 应用程序:

  • class AAA
  • class BBB 继承自 AAA
  • class CCC 继承自 AAA
  • class DDD 继承自 CCC

(所有类都标记为public

现在我有以下地图:

map <DWORD, AAA*> 

我在map 中找到了一个AAA 对象,通过DWORD id,但现在我想知道AAA 的类型是什么:

这将是逻辑:

if(AAA is BBB)
{
...
}
if(AAA is CCC)
{
...
}
if(AAA is DDD)
{
...
}

你知道如何用 C++ 编写它(不添加getType() 的多态函数)吗?

【问题讨论】:

  • 为什么需要知道类型?
  • 为什么需要它?如果你的类是多态的,编译器会为你完成剩下的工作。

标签: c++ object


【解决方案1】:

要求这个表明你做错了。您正在尝试复制为虚拟方法发明的东西。只需在您的基类中添加一个虚拟方法即可。

class AAA
{
public:
    virtual void DoSomething() = 0;
}

class BBB : public AAA
{
public:
    void DoSomething() { ... }
}

class CCC : public AAA
{
public:
    void DoSomething() { ... }
}

class DDD : public AAA
{
public:
    void DoSomething() { ... }
}

在你的调用代码中,你的逻辑很简单:

// no need for if() blocks. it's the point of virtual methods.
AAA* somePointer;
...
somePointer->DoSomething();

我意识到您可能不能只是将您当前的“dosomething”代码复制/粘贴到其中。但这是您应该在这种情况下使用的模式。也许使用GetSomeInfo 之类的东西而不是DoSomething 更有意义,调用者可以使用它来做它需要做的任何事情。此模式的具体用法取决于您的上下文。

【讨论】:

    【解决方案2】:

    如果您的对象是多态的(即至少有一个虚函数),请执行dynamic_cast&lt;T*&gt;

    如果结果不是NULL,那么你有一个T 类型的对象。但是虚函数是去 IMO 的更好方法。

    注意:RTTI 需要为 enabled on your compiler(在绝大多数情况下都是这样)

    编辑:感谢@Als 和@flipchart 的补充

    【讨论】:

    • dynamic_cast 仅适用于多态类。 typeid() 也是如此,这可能会给您带来非多态层次结构的错误结果。
    • 指针的dynamic_cast将返回null。在引用上,它将引发异常。另请注意,这需要运行时类型识别 (RTTI)
    猜你喜欢
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 2017-09-19
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 2014-01-07
    相关资源
    最近更新 更多