C ++获取对象类型

时间:2011-10-27 09:22:31

标签: c++ object

我有一个C ++应用程序,它有以下类:

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

(所有课程都标记为public

现在我有以下地图:

map <DWORD, AAA*> 

我在AAA中找到map个对象,DWORD id,但现在我想知道AAA的类型:

这将是逻辑:

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

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

2 个答案:

答案 0 :(得分:7)

要求这表明你的做法是错误的。您正在尝试复制虚拟方法的发明内容。只需在您的基类中添加一个虚拟方法。

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”代码复制/粘贴到这里。但这是您应该在此方案中使用的模式。或许DoSomething代替GetSomeInfo更有意义,调用者可以使用它做任何需要做的事情。此模式的具体用法取决于您的上下文。

答案 1 :(得分:4)

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

如果结果不是NULL,那么您有一个T类型的对象。但虚拟功能将成为IMO的更好方式。

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

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