如何检查继承类的指针?

时间:2014-05-15 19:34:21

标签: c++ inheritance polymorphism

假设我们有两个类:一个继承自A类的多态性类A和B类。如何检查A类指针是否指向B类对象?

3 个答案:

答案 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包含的实例,在运行时。