C ++:从抽象指针向量中获取继承类型

时间:2014-11-07 18:29:31

标签: c++ pointers inheritance vector

所以我有一个包含Component抽象类的指针的向量,并且让我说我有来自component,foo和bar的2个继承类,有没有办法让指针具有类型"富"从这个向量?

    vector<Component*> components;
    class foo : Component;
    class bar : Component;
    components.push_back(new foo());
    components.push_back(new bar());

感谢。

2 个答案:

答案 0 :(得分:2)

是的:

Component* c = components[0];
if (foo* f = dynamic_cast<foo*>(c)) {
    // use f
}
else {
    // c is not a foo. Maybe it's a bar, or something else
}

因此,如果你想编写一个函数来查找 foo*,你可以这样做(假设是C ++ 11):

foo* find_foo(const std::vector<Component*>& components)
{
    for (auto c : components) {
        if (foo* f = dynamic_cast<foo*>(c)) {
            return f;
        }
    }
    return nullptr;
}

演员阵容dynamic_cast<foo*>将返回有效的foo*nullptr不会投掷。从标准§5.2.7.9:

  

失败的强制转换为指针类型的值是所需结果类型的空指针值。

答案 1 :(得分:1)

是的,您可以通过使用RTTI的概念来实现: -

#include <typeinfo>
//Using for loop iterate through all elements
if ( typeid(*iter) == typeid(Foo) )
  //You got the Foo object

但这在C ++中几乎不可取。