Ошибка «Невозможно выделить объект абстрактного типа» - PullRequest
27 голосов
/ 08 сентября 2011

Ошибка здесь:

vector<Graduate *> graduates;
graduates.push_back(new AliceUniversity(identifier,id,salary,average));

Родительский класс:

Graduate::Graduate(char identifier,
                   long id,
                   int salary,
                   double average)
    : _identifier(identifier),
      _id(id),_salary(salary),
      _average(average)
{
}

Родительский класс:

UniversityGraduate::UniversityGraduate(char identifier,
                                       long id,
                                       int salary,
                                       double average)
    : Graduate(identifier,id,salary,average)
{
}

Фактический / дочерний класс:

AliceUniversity::AliceUniversity(char identifier,
                                 long id,
                                 int salary,
                                 double average)
    : UniversityGraduate(identifier,id,salary,average)
{
    _graduateNum++;
    _sumOfGrades += average;
    _avrA = getAverage();
}

Я знаю, что это длинный путь, я не могу написать весь код здесь ...

Ответы [ 2 ]

76 голосов
/ 08 сентября 2011

В C ++ класс с хотя бы одной чисто виртуальной функцией называется abstract class .Вы не можете создавать объекты этого класса, но можете иметь только указатели или ссылки на него.

Если вы наследуете абстрактный класс, убедитесь, что вы переопределяете и определяете все чисто виртуальные функции для вашего класса.

Из вашего фрагмента Ваш класс AliceUniversity представляется абстрактным классом.Он должен переопределить и определить все чисто виртуальные функции классов Graduate и UniversityGraduate.

Чистые виртуальные функции - это те, которые имеют = 0; в конце объявления.

Пример: virtual void doSomething() = 0;

Для конкретного ответа вам необходимо опубликовать определение класса, для которого вы получаете ошибку, и классов, из которых этот класс является производным.

15 голосов
/ 08 сентября 2011

У вас должна быть некоторая виртуальная функция, объявленная в одном из родительских классов и никогда не реализованная ни в одном из дочерних классов. Убедитесь, что все виртуальные функции реализованы где-то в цепочке наследования. Если определение класса включает в себя чисто виртуальную функцию, которая никогда не реализуется, экземпляр этого класса никогда не может быть создан.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...