Рассмотрим заголовочный файл класса Employee



В число его открытых элемент-функций входят конструктор, принимающий в качестве аргументов имя, фамилию и номер социальной страховки (строка 12); set-функции, устанавливающие имя, фамилию и номер страховки (соответственно строки 14, 17 и 20); get -функции, возвращающие имя, фамилию и номер страховки (строки 15, 18 и 21); чисто виртуальная функция earnings (строка 24) и виртуальная функция print (строка 25). Как вы помните, мы объявили earnings чисто виртуальной функцией, так как, чтобы определить способ расчета заработка, мы должны знать конкретный тип служащего. Объявление этой функции как чисто виртуальной указывает, что каждый конкретный класс должен предусматривать соответствующую реализацию earnings и что программа может использовать указатели базового класса Employee, чтобы полиморфно вызывать функцию для служащих любого типа.

Employee.cpp показывает реализации элемент-функций для класса Employee.

Для виртуальной функции earnings реализации не предусмотрено.

Обратите внимание, что для виртуальной функции print (строки 54-58 в Employee.cpp) предусмотрена реализация, которая будет заменяться в каждом из производных классов. Однако каждая из этих реализаций будет вызывать версию print абстрактного класса для вывода информации, общей для всех классов иерархии Employee.

 

Создание конкретного производного класса SalariedEmployee

Класс SalariedEmployee (SalariedEmployee.h - SalariedEmployee.срр) является производным от Employee (строка 8 SalariedEmployee.h). В число его открытых элемент-функций входят конструктор, принимающий в качестве аргументов имя, фамилию, номер социальной страховки и недельную ставку зарплаты (строки 11-12); set-функция для присваивания нового неотрицательного значения элементу данных weeklySalary (строка 14); get-функция, возвращающая значение weeklySalary (строка 15); виртуальная функция earnings, вычисляющая заработок служащего SalariedEmployee (строка 18); виртуальная функция print, выводящая тип служащего за которым следует информация о служащем, выдаваемая функцией print класса Employee и функцией getWeeklySalary (строка 19).

SalariedEmployee.срр показывает реализации элемент-функций для SalariedEmployee. Конструктор класса передает имя, фамилию и номер страховки конструктору Employee (строка 11) для инициализации закрытых элементов данных, унаследованных от базового класса, но недоступных в производном классе. Функция earnings (строки 30-33) заменяет чисто виртуальную функцию earnings в Employee конкретной реализацией, возвращающей недельную зарплату служащего SalariedEmployee. Если не реализовать earnings, класс SalariedEmployee был бы абстрактным и любая попытка создать объект этого класса приводила бы к ошибке компиляции (а мы, естественно, хотим здесь, чтобы SalariedEmployee был конкретным классом). Заметьте, что в заголовочном файле класса SalariedEmployee мы объявили элемент-функции earnings и print как virtual (строки 18-19 SalariedEmployee.h), хотя на самом деле указание ключевого слова virtual перед этими функциями является излишним. Мы объявили их виртуальными в базовом классе Employee, поэтому они останутся виртуальными во всей классовой иерархии. Явное объявление таких функций виртуальными на всех уровнях иерархии способствует ясности программы.

Функция print класса SalariedEmployee (строки 36-41 SalariedEmployee.срр) заменяет функцию print в Employee. Если бы класс не заменял print, он унаследовал бы версию print из Employee. В этом случае функция print выдавала бы для SalariedEmployee только полное имя и номер страховки, что не является вполне адекватным для служащего SalariedEmployee. Чтобы напечатать полную информацию о служащем, функция print производного класса выводит "salaried employee:", после чего следует информация базового класса Employee (т.е. имя, фамилия и номер страховки), печатаемая посредством вызова базовой функции print при помощи операции разрешения области действия (строка 39) — это хороший пример утилизации кода. Вывод функции print класса SalariedEmployee содержит также недельную зарплату служащего, получаемую вызовом функции getWeeklySalary класса.

 


Дата добавления: 2018-08-06; просмотров: 175; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!