Да, это возможно, и на самом деле необходимо использовать указатели, если вы хотите, чтобы ваш вектор содержал объекты из всей иерархии классов, а не из одного типа. (Отказ от использования указателей приведет к страшной проблеме нарезки объектов - все объекты автоматически преобразуются в тип базового класса. Это не диагностируется компилятором и почти наверняка не то, что вам нужно.)
class c
{
void virtual func();
};
class sc:public c
{
void func(){cout<<"using func";}
};
sc cobj;
vector<c*> cvect; // Note the type is "c*"
cvect.push_back(&cobj); // Note the "&"
vector<c*>::iterator citer;
for(citer=cvect.begin();citer != cvect.end();citer++) // Use "!=" not "<"
{
(*citer)->func();
}
Обратите внимание, что с вектором указателей вам необходимо выполнить собственное управление памятью , поэтому будьте очень осторожны - если вы будете использовать локальные объекты (как указано выше), они не должны выпадать из сфера до контейнера Если вы используете указатели на объекты, созданные с помощью new
, вам потребуется delete
их вручную, прежде чем контейнер будет уничтожен. В этом случае вам следует рассмотреть возможность использования интеллектуальных указателей, таких как smart_ptr
, предоставленный Boost
.