2016-12-19 78 views
3

我已经继承层次如何检查的对象是基类

class A{ 
    virtual bool fun() = 0; 
}; 

class B: public A{ 
... 
} 

class C: public B{ 
... 
} 

class D: public C{ 
... 
} 

class E: public B{ 
... 
} 

在主程序中,我执行类似

for(auto pA: ObjVector) 
{ 
    if(pA->fun()){ 
     ... 
    } 
} 

现在我想知道Pa为包含以下基类B对象。 据我所知2种方式

  1. dynamic_cast所有派生类对象,测试是否所有dynamic_casts失败 ,只有通过对B我们确信, 对象类型的B

  2. 添加一个接口方法,将返回值类型enumeration 值并标识B对象。

是否有任何其他方法来识别B类?

+1

如果需要知道什么对象你正在处理你编写代码,它更可能你有一个缺陷在你的设计中。 – PaulMcKenzie

+0

我正在解决现有代码中的问题,这个设计是由客户给出的,我们不应该改变他的设计。 –

回答

6

您可以使用typeid运算符。例如

if (typeid(*pA) == typeid(B)) { 
    /* ... ptr points to a B ... */ 
} 

这项工作pA只有正是乙

typeid - documentation

+0

谢谢你,让我测试你的解决方案,我会在这里更新。我从未在 –

+0

之前使用过typeid,因为在单个测试中确实匹配的方法得到了我的投票。 – StoryTeller

+0

谢谢!你的解决方案解决了我的问题 –

0

我认为这是唯一的选择。

我强烈建议不要使用enum来标识对象类型。它很快导致违反Open/Closed Principle

使用dynamic_cast是好了很多,但它是值得采取强硬看待问题,以确保它是绝对必要的 - 你不能完成你想要使用virtual功能,无论你如何尝试。