我有一个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()
的多态函数)吗?
答案 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的补充