【问题标题】:Identifying derived class from base class从基类中识别派生类
【发布时间】:2012-09-22 16:45:31
【问题描述】:

有什么方法可以检查两个实例是否是同一个派生类?比如:

Base *inst1 = new A();
Base *inst2 = new B();
Base *inst3 = new A();


bool b1 =  (inst1->class== inst2->class); //<-- should evaluate to false
bool b1 =  (inst2->class== inst3->class); //<-- should evaluate to true

显然,我可以在基类中添加一个虚函数并实现每个派生类以返回一个唯一值。但是,我宁愿不必为派生类实现任何特定的东西,因为我正在制作一个基于从这个基类派生的 API。

【问题讨论】:

    标签: c++ pointers polymorphism virtual abstract


    【解决方案1】:

    我不知道返回实例派生类的方法。但是,dynamic_cast 可用于检查实例是否与特定的类兼容。

    A& inst_ans = dynamic_cast(inst2); 会抛出异常

    作为 A& inst_ans = dynamic_cast(inst1); 会正常执行

    http://en.wikipedia.org/wiki/Dynamic_cast

    【讨论】:

      【解决方案2】:
      typeid(*inst1) == typeid(*inst2)
      

      假设Base 至少有一个虚函数。否则,typeid 将无法获得正确的派生类型。

      【讨论】:

      • 为了清楚起见,如果没有虚函数,也无法区分基类和派生类(不进行不安全的强制转换),所以你可能不会关心这个警告无论如何。
      猜你喜欢
      • 2014-04-15
      • 2011-01-05
      • 1970-01-01
      • 2015-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多