Этот вопрос связан с двумя фундаментальными концепциями C ++: конструктор производного класса , сгенерированные компилятором функции-члены .
Для конструктор производного класса, сначала необходимо вызвать конструктор базового класса.В этом случае
Student::Student(void){
x = 0, Lab1 = 0, Lab2 = 0, Lab3 = 0, Lab4 = 0, Lab5 = 0, Lab6 = 0,
LabPoints = 0, Midterm = 0, Final = 0 ;
LabAvg = 0.0, ExamAvg = 0.0, Prcnt = 0.0 ;
StuName = "" ;
}
Не указывает, какой конструктор класса Person использовать.Таким образом, компилятор автоматически вставит вызов конструктора класса Person по умолчанию, Person:Person()
.
Для функций, сгенерированных компилятором, компилятор будет генерировать следующие функции-члены для каждого класса, если они не объявлены
- Конструктор по умолчанию
- Конструктор копирования
- Оператор присваивания
- Destructor
Однако класс Person объявил конструктор Person:Person(void)
, поэтому компилятор не сгенерирует конструктор по умолчанию.Когда дело доходит до ссылки Person:Person()
для класса Student, компилятор генерирует ошибку ссылки.
Существует два решения для ошибки ссылки.
- стереть замедление
Person::Person(void);
, следовательно, будет сгенерирован конструктор по умолчанию. - добавить определение
Person::Person(void);
.Компоновщик будет использовать наш собственный конструктор по умолчанию.
Для расширения давайте предположим, что конструктор, определенный в классе person, равен Person:Person(string name)
.Тогда в решении 2 также необходимо изменить конструктор класса Student.
Student::Student(void):Person("any string"){
x = 0, Lab1 = 0, Lab2 = 0, Lab3 = 0, Lab4 = 0, Lab5 = 0, Lab6 = 0,
LabPoints = 0, Midterm = 0, Final = 0 ;
LabAvg = 0.0, ExamAvg = 0.0, Prcnt = 0.0 ;
StuName = "" ;
}