C ++:是类的实例后代

时间:2010-11-11 22:33:26

标签: c++

假设我们有三个类A,B和C. B来自A,C来自B. 现在我们有一个指向A类对象的指针。由于Polymorphism,它实际上可以指向所有三个类的实例。

使用typeid(),我可以检查指针实际引用的类型。但我试图确定它是否指向B类的任何后代。也就是说我正在寻找某种IsDescendantOf(unkownclass,baseclass)函数。有没有为什么要在C ++中这样做?

4 个答案:

答案 0 :(得分:11)

使用dynamic_cast。失败时返回NULL:

B* pb = dynamic_cast<B*>(pa);

您可能会发现此MSDN article有用。

答案 1 :(得分:3)

您还可以在编译时使用模板元编程对此进行测试。如果所讨论的类没有任何虚函数,它甚至可以工作,dynamic_cast不会。

template <typename D, typename B>
class is_derived_from {
   class No { };
   class Yes { No no[2]; };

   static Yes Test(B*);
   static No  Test(...);
public:
   enum { inherits = sizeof(Test(static_cast<D*>(0))) == sizeof(Yes) };
   static bool is_derived() { return inherits; }
};

我认为这是源于一个优秀的GoTW系列。

答案 2 :(得分:1)

您可以通过dynamic_cast<TargetType*>(ptr)转换对象,然后检查结果是否为null(无法转换 - 不是后代)。

答案 3 :(得分:0)

使用std::is_base_of<type_traits>中的static_assert来检查编译时间