假设我们有三个类A,B和C. B来自A,C来自B. 现在我们有一个指向A类对象的指针。由于Polymorphism,它实际上可以指向所有三个类的实例。
使用typeid(),我可以检查指针实际引用的类型。但我试图确定它是否指向B类的任何后代。也就是说我正在寻找某种IsDescendantOf(unkownclass,baseclass)函数。有没有为什么要在C ++中这样做?
答案 0 :(得分:11)
答案 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
来检查编译时间