Итак, у меня есть вектор, который содержит указатели абстрактного класса Component
, и, допустим, у меня есть 2 унаследованных класса из компонента, foo и bar, есть ли способ получить указатель с типом "foo" из этого вектора?
vector<Component*> components;
class foo : Component;
class bar : Component;
components.push_back(new foo());
components.push_back(new bar());
Благодарю.
Ага:
Component* c = components[0];
if (foo* f = dynamic_cast<foo*>(c)) {
// use f
}
else {
// c is not a foo. Maybe it a bar, or something else
}
Поэтому, если вы хотите написать функцию для поиска foo*
, вы можете сделать это (предполагая С++ 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:
Значение неудавшегося нажатия на тип указателя - это нулевое значение указателя требуемого типа результата.
Да, вы можете это сделать, используя концепции RTTI: -
#include <typeinfo>
//Using for loop iterate through all elements
if ( typeid(*iter) == typeid(Foo) )
//You got the Foo object
Но это почти никогда не предпочтительнее в C++.