【问题标题】:Identifying a subclass given a pointer to its base class?在给定指向其基类的指针的情况下识别子类?
【发布时间】:2013-04-14 17:05:15
【问题描述】:

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

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

【问题讨论】:

  • Parent* 始终是 Parent*。它从不Child*。您要问的是“它指向的事物的类型是什么”。
  • Kerrek SB:昨天我对你冷眼旁观,但是当我开始实际编程时,你的评论可能比页面上的任何其他内容都更有价值。抱歉……

标签: c++ dynamic-typing


【解决方案1】:

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

【讨论】:

  • 这听起来比创建大量子类指针更适合我一直在寻找的东西......
  • 值得一提的是,typeid(*foo) 只会在父类至少有一个虚方法时返回正确的运行时类型(即Child1 而不是Parent)。
【解决方案2】:

您可以为此使用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
}

【讨论】:

    【解决方案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 :'(
        }
    }
    

    【讨论】:

    • 很好——我不知道 dynamic_cast 可以做到这一点! (但是,这就是我问的原因。)
    • @ExOttoyuhr 不客​​气。是的,我设法在 Andy Prowl 之前提供了一个答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 2020-11-17
    • 2011-05-03
    • 2014-12-25
    • 1970-01-01
    • 2019-08-28
    • 2012-12-26
    相关资源
    最近更新 更多