Хранить производный объект в векторе базового типа

У меня есть 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();
}

Может ли проблема быть здесь?

0

Решение

Я пытался сделать то же самое с итератором … этот код работает нормально для меня, поэтому, если ваша проблема сохраняется, рассмотрим другой компилятор =)

#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<>, хотя это побеждает весь смысл использования виртуальных методов. Удачи.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]