C++检查对象是否是给定超类的后代

C++ check if object is a descendant of a given superclass

本文关键字:超类 后代 检查 对象 是否是 C++      更新时间:2023-10-16

我有一个指向对象的指针,我想知道该对象是给定类的类型还是C++中给定类的子类的类型。

使用 dynamic_cast:

class A {
public:
    virtual ~A() = default;
};
class B : public A {    
};
B * obj = new B();
auto obj2 = dynamic_cast<A*>(obj);
if (obj2 != nullptr) {
    std::cout << "B is an A" << std::endl;
}

开头的指针必须具有类型。假设该类型是 T* .假设"给定类"是G.我认为(尽管我可能是错的)这是您想知道的对象的完整类型,而不是类型TG之间的关系。

如果T是至少有一个虚函数的类类型,那么你可以在指针上执行所需的测试,ptr如下所示:

if (dynamic_cast<G*>(ptr)) {
    // then the complete type of your object is either G or a subclass
} else {
    // it isn't
}

如果T不是类类型,或者它没有虚函数,那么你想要做的事情是不可能的。您必须为指针找到更有用的静态类型。

如果你想知道的只是G是"基础还是相同"T那么你不需要dynamic_cast或有一个虚拟函数。你只需要std::is_base_of.