我有一个指向对象的指针,我想知道该对象是给定类的类型还是C ++中给定类的子类的类型。
答案 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
。我认为(虽然我可能错了)它是你想要了解的完整类型的对象,而不是类型T
和G
之间的关系。
如果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}}。