8

假设我有一个抽象基类 Parent 和子类 Child1 和 Child2。如果我有一个接受 Parent* 的函数,有没有办法(可能使用 RTTI?)在运行时确定该函数实际收到的是 Child1* 还是 Child2*?

到目前为止,我在这里使用 RTTI 的经验是,当 foo 是 Parent* 时,typeid(foo) 返回 typeid(Parent*) 而不管 foo 属于哪个子类。

4

3 回答 3

6

您需要查看取消引用指针的 typeid,而不是指针本身;即,typeid(*foo),而不是 typeid(foo)。询问取消引用的指针将为您提供动态类型;如您所见,询问指针本身只会为您提供静态类型。

于 2013-04-21T21:12:37.010 回答
5

你可以用std::dynamic_cast这个。

Parent* ptr = new Child1();
if(dynamic_cast<Child1*>(ptr) != nullptr) {
    // ptr is object of Child1 class
} else if(dynamic_cast<Child2*>(ptr) != nullptr) {
    // ptr is object of Child2 class
}

此外,如果您使用智能指针,例如std::shared_ptr,您可以像这样检查它:

std::shared_ptr<Parent> ptr(new Child1());
if(std::dynamic_pointer_cast<Child1>(ptr) != nullptr) {
    // ptr is object of Child1 class
} else if(std::dynamic_pointer_cast<Child2>(ptr) != nullptr) {
    // ptr is object of Child2 class
}
于 2013-04-21T21:11:07.133 回答
3

当然:

BaseClass *bptr = // whatever, pointer to base class
SubclassOne *safe_ptr_one = dynamic_cast<SubclassOne *>(bptr);
if (safe_ptr_one != nullptr) {
    // Instance of SubclassOne
} else {
    // not an instance of SubclassOne, try the other one
    SubclassTwo *safe_ptr_two = dynamic_cast<SubclassTwo *>(bptr);
    if (safe_ptr_two != nullptr) {
        // Instance of SubclassTwo
    } else {
        // it wasn't either one :'(
    }
}
于 2013-04-21T21:09:29.450 回答