Хранение полиморфных объектов в контейнере - классика жанра:
class A { ... };
class B : public A { ... };
std::vector<A*> BunchOfObjects;
BunchOfObjects.push_back(new B);
Главное - не забыть уничтожить удаляемые из контейнера объекты. И если делать это через оператор
delete
- еще про виртуальный деструктор у базового класса не забыть бы.
Хотя... другое классическое решение позволяет обойтись и без первого и без второго:
std::vector< boost::shared_ptr<A> > BunchOfObjects;
BunchOfObjects.push_back(boost::shared_ptr<A>(new B));
Наличие виртуального деструктора в таком случае не принципиально - shared_ptr запоминает как нужно удалять объект, по умолчанию это будет оператор delete для нужного типа. Таким образом можно хранить, например, список динамически созданных окон - предков ATL::CWindow. Более того, если от хранимых объектов нужна лишь возможность их в нужный момент удалить, то можно вообще не задумываться от их типе используя boost::shared_ptr<void>.