У меня есть std :: vector указателей типа базового класса:
vector<Base*> baseList;
И я помещаю производный тип класса в вектор:
Derived* derivedObject = new Derived();
baseList.push_back(derivedObject);
Но когда я повторяю список и вызываю функцию, которая переопределена из базового класса производным классом, код в производном классе не вызывается. Я правильно использую вектор?
Мой базовый класс использует ключевое слово virtual перед объявлением своих функций, а производный класс получает базовый класс с помощью:
class Derived : public Base
Есть идеи, что я здесь делаю не так?
РЕДАКТИРОВАТЬ:
Чтобы вызвать функцию, которую я объявил:
typedef vector<App*>::iterator AppIterator;
AppIterator begin() { return l_Apps.begin(); }
AppIterator end() { return l_Apps.end(); }
И я называю функцию так:
for (AppIterator it = begin(); it != end(); ++it)
{
(*it)->Initialize();
}
Может ли проблема быть здесь?
Я пытался сделать то же самое с итератором … этот код работает нормально для меня, поэтому, если ваша проблема сохраняется, рассмотрим другой компилятор =)
#include <iostream>
#include <vector>
class Base
{
public:
virtual void f()
{
std::cout << "Base\n";
}
};
class Derived: public Base
{
public:
virtual void f()
{
std::cout << "Derived\n";
}
};
int main()
{
std::vector<Base*> s;
s.push_back(new Base());
s.push_back(new Derived());
s.push_back(new Base());
s.push_back(new Derived());
s.push_back(new Base());
s.push_back(new Derived());
for (std::vector<Base*>::iterator it = s.begin(); it != s.end(); ++it)
{
(*it)->f();
}
return 0;
}
выход у меня есть:
Base
Derived
Base
Derived
Base
Derived
Также вы можете попытаться наложить указатели dynamic_cast<>
, хотя это побеждает весь смысл использования виртуальных методов. Удачи.
Других решений пока нет …