C ++ не обрабатывает вызовы конструктора специально в телах конструктора.Следующая строка
Employee(empNum, name, address, phone);
создаст новый, совершенно отдельный экземпляр Employee
, а затем отбросит его, потому что результирующий объект не назначен ни для чего.Значения полей этого объекта не копируются в экземпляр HourlyEmployee
, который вы создаете.
Чтобы использовать конструктор суперкласса в подклассе 1, используйте список инициализатора члена в определении конструктора подкласса.
HourlyEmployee::HourlyEmployee(int empNum, std::string name, std::string
address, std::string phone, double hoursWorked, double hourlyWage)
: Employee(empNum, name, address, phone) {
this->hoursWorked = hoursWorked;
this->hourlyWage = hourlyWage;
}
Таким образом, C ++ будет вызывать конструктор Employee
для инициализации того же объекта, который инициализируется этим конструктором HourlyEmployee
.
Вы можете даже пойти немного дальше и сократить ваши конструкторы до просто списков инициализаторов членов.Приятным побочным эффектом является то, что при этом не требуется вводить this->
или придумывать разные схемы именования.
Employee::Employee(int empNum, std::string name, std::string address,
std::string phone)
: empNum(empNum),
name(name),
address(address),
phone(phone) {}
HourlyEmployee::HourlyEmployee(int empNum, std::string name, std::string
address, std::string phone, double hoursWorked, double hourlyWage)
: Employee(empNum, name, address, phone),
hoursWorked(hoursWorked),
hourlyWage(hourlyWage) {}
Вы можете узнать больше по ссылке выше, но процитируйте короткое объяснение:
Перед началом выполнения составного оператора, который формирует тело функции конструктора, завершается инициализация всех прямых баз, виртуальных баз и нестатических элементов данных.Список инициализаторов элементов - это место, где можно указать инициализацию этих объектов по умолчанию.