如何检查对象是否是基类类型

时间:2016-12-19 05:53:34

标签: c++ inheritance

我有以下继承层次结构

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对象。

  3. 是否还有其他方法可以识别B类?

2 个答案:

答案 0 :(得分:6)

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

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

时,

这项工作

typeid - documentation

答案 1 :(得分:0)

我认为这是唯一的选择。

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

使用dynamic_cast要好得多,但是要仔细研究这个问题以确保它是绝对必要的 - 你无法完成你想要使用的virtual是值得的。 1}}无论你如何尝试它都会发挥作用。