假设我们有两个类:一个继承自A类的多态性类A和B类。如何检查A类指针是否指向B类对象?
答案 0 :(得分:6)
假设runtime type information (RTTI)已启用,您可以使用B*
将指针强制转换为dynamic_cast
,并查看是否返回非空值:
A* ptr = ... // some pointer
if (dynamic_cast<B*>(ptr)) {
// ptr points to an object of type B or any type derived from B.
}
另一种方法是使用typeid
:
if (typeid(*ptr) == typeid(B)) {
// ptr points to an object of type B, but not to a type derived from B.
}
注意:如果您经常需要这样做,很有可能您的设计可以改进。
答案 1 :(得分:2)
您可以使用dynamic_cast
。
void foo(A* aPtr);
{
if ( dynamic_cast<B*>(aPtr) != NULL)
{
// Got a B.
}
}
void bar()
{
B b;
foo(&b);
}
答案 2 :(得分:0)
不想破坏乐趣,但如果没有enum
可用,基类中的初始化RTTI
成员也会这样做。
前几天我在想,在这些经典的OOP问题中,人们也可以使用variant
类,比如说:
variant<Tiger, Cat, Frog, Dog> object;
这些类可能都是继承的,比如从Animal
继承,根本不需要实现中的虚函数,但是需要检查类型,variant
包含的实例,在运行时。