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

时间:2013-12-19 21:11:24

标签: c++

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

2 个答案:

答案 0 :(得分:5)

使用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;
}

答案 1 :(得分:2)

您开始使用的指针必须具有类型。假设类型为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功能。您只需要{{1}}。