【问题标题】:how to check if the object is base class type如何检查对象是否是基类类型
【发布时间】:2016-12-19 14:45:36
【问题描述】:

我有以下继承层次

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 对象。 据我所知有两种方法

  1. dynamic_cast 对象并测试所有派生类(如果失败) 对于所有dynamic_casts 并且仅通过B 我们确信 对象的类型为B

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

还有其他方法可以识别B 类吗?

【问题讨论】:

  • 如果您编写的代码需要知道您正在处理的对象是什么,那么您的设计很可能存在缺陷。
  • 我正在修复现有代码中的一个问题,此设计由客户提供,我们不应更改他的设计。

标签: c++ inheritance


【解决方案1】:

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

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

这项工作pA 正好是 B

typeid - documentation

【讨论】:

  • 谢谢你,让我测试一下你的解决方案,我会在这里更新。我以前从未使用过 typeid
  • 我投票赞成在单个测试中进行精确匹配的方法。
  • 谢谢!!你的解决方案解决了我的问题
【解决方案2】:

我认为这些是唯一的选择。

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

dynamic_cast 的使用要好得多,但值得认真研究一下这个问题,以确保它是绝对必要的——无论你如何使用 virtual 函数,你都无法完成你想要的试试看。

【讨论】:

    猜你喜欢
    • 2011-09-26
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 2011-09-28
    相关资源
    最近更新 更多