检查该类型是否来自给定的父类型

Check if the type comes from a given parent type

本文关键字:类型 父类 是否 检查      更新时间:2023-10-16

我的问题的简单示例:

我有一个抽象类A。我有两个从A继承的抽象类BC。我有很多继承自BC:的最终类

class A;
class B : public A;
class C : public A;
class B1 : public B;
class B2 : public B;
class C1 : public C;
class C2 : public C;

我实现了一种接收A指针的算法,该算法必须知道该类型是来自B还是C才能正常工作:

void algorithm(boost::shared_ptr<const A> a)
{
  if(*a is a B instance)
    // do something
  else if(*a is a C instance)
    // do something other
}

如果没有C++11,我该如何检查

我知道如何用typeid(*a) == typeid(C1)检查最终类型,但我不知道如何检查父类型。。。

您可以使用dynamic_pointer_cast:

if (std::dynamic_pointer_cast<B>(a)) {
   ...
}
else if (std::dynamic_pointer_cast<C>(a) {
   ...
}

使用dynamic_cast

 if (dynamic_cast<B *>(a))
 {
      //   // a actually points at a B, or something derived unambiguously from B
 }

当然,更一般地说,您需要重新审视功能的设计。通常情况下,最好不需要知道从A派生的类。避免这种情况通常意味着使用A作为多态库,为函数中所需的所有功能提供接口(例如,BC等类可能专门用于自己的virtual函数集)。