Вектор класса-родителя в c++
vector <Employee> workers;
for (int i = 0; i < 50; i++) {
switch (rand() % 3) {
case 0:{workers.push_back(Developer()); continue; }
case 1:{workers.push_back(Manager()); continue; }
case 2:{workers.push_back(Administrator()); continue; }
}
}
Добрый день, учусь проге на c++ и у меня возник вопрос. Вот у меня есть абстрактный класс Employee. Я создал вектор workers. В конструкторе сразу же с помощью рандомайзеров присваиваются значения всем полям. У меня есть три класса-наследника: Developer, Manager и Administrator. Выскакивает вот такая вот ошибка:
C2259 Employee: невозможно создать экземпляр абстрактного класса
В чем проблема? Логика программы, синтаксис? Как лучше поступить?
Ответы (1 шт):
Вектор хранит обьекты типа, который Вы указываете в угловых скобках. Класс Employee - это абстрактный класс. Т.е. нельзя создавать обьекты этого класса. Вот Вы и получаете ошибку. Но даже не будь он абстрактный, то код (скорее всего) был бы неверным, так как происходила бы "срезка" (создание обьекта базового класса из обьекта производного класса). Вам нужно хранить указатели на Employee в векторе, потому что указатель на базовый класс может указывать на обьект производного класса без явного преобразования. Например так:
vector <Employee*> workers;
for (int i = 0; i < 50; i++)
{
switch (rand() % 3)
{
case 0 :
workers.push_back(new Developer());
break;
case 1 :
workers.push_back(new Manager());
break;
case 2 :
workers.push_back(new Administrator());
break;
}
}
Но тогда не забудьте потом освободить память. Или же используйте умные указатели.