Программирование >>  Структурное программирование 

1 ... 202 203 204 [ 205 ] 206 207 208 ... 342


базового класса

wage = w > О ? w : О;

hours = h >= О S& h < 168 ? h : 0;

Установка почасовой оплаты void HourlyWorker::setWage(float w) { wage = w > 0 ? w : 0; }

Установка числа отработанных часов void HourlyWorker::setHours(float h)

{ hours = h >= 0 && h < 168 ? h : 0; }

Опеределение заработной платы служащих из класса HourlyWorker float HourlyWorker::earnings() const ( return wage * hours; }

Печать имени служащего из класса HourlyWorker

void HourlyWorker::print() const

cout << endl << Служащий с почасовой оплатой: getFirstNameО getLastName();

Рис. 10.1. Определения функций-элементов класса HourlyWorker (часть 10 из 12)

Класс HourlyWorker (рис. 10.1, части 9 и 10) является производным от класса Employee с открытым наследованием. Открытые функции-элементы включают: конструктор, который принимает в качестве аргументов имя, фамилию, почасовую оплату и количество отработанных часов, а также передает имя и фамилию конструктору Employee; функцию set, которая присваивает новые значения скрытым данным-элементам wage и hours; виртуальную функцию earnings, в которой определено, как начислять заработную плату в классе HourlyWorker; виртуальную функцию print, которая выводит тип служащего и его имя.

Программа драйвер (рис. 10.1, части 11 и 12) начинается с объявления указателя базового класса ptr типа Employee *. Последующие три сегмента кода в функции main сходны друг с другом, поэтому мы обсудим только первый сегмент, который связан с объектом Boss.

H0URLY1.CPP

Определения функций-элементов класса HourlyWorker

iinclude <iostream.h> iinclude hourlyl.h

Конструктор класса HourlyWorker

HourlyWorker:-.HourlyWorker (const char *first, const char *last,

float w, float h) : Employee(first, last) Вызов конструктора



Employee *ptr; Указатель базового класса

Boss b( John , Smith , 800.00);

ptr = &b; Указатель базового класса на объект

производного класса ptr->print(); Динамическое связывание

cout << заработал $ <<ptr->earnings(); Динамическое

связывание

Ь.print О; Статическое связывание

cout << заработал $ << b.earnings О; Статическое

связывание

CommissionWorJcer с ( Sue , Jones , 200.0, 3.0, 150);

ptr = &с; Указатель базового класса на объект

производного класса ptr->print(); Динамическое связывание

cout заработал $ ptr->earnings(); Динамическое

связывание

с.print О; Статическое связывание

cout заработал $ с.earnings(); Статическое

связывание

PieceWor)cer p( Bob , Lewis , 2.5, 200);

ptr = &p; Указатель базового класса на объект

производного класса ptr->print (); Динамическое связывание

cout заработал $ ptr->earnings(); Динамическое

связывание

р.print О; Статическое связывание

cout заработал $ р.earnings(); Статическое

связывание

HourlyWor)cer h( Karen , Price , 13.75, 40);

ptr = &h; Указатель базового класса на объект

производного класса ptr->print(); Динамическое связывание

cout заработал $ ptr->earnings(); Динамическое

связывание

h.print О; Статическое

связывание

FIGIO l.CPP

Драйвер иерархии Employee

iinclude <iostream.h>

tinclude <iomanip.h> tinclude employ2.h tinclude bossl.h tinclude commisl.h tinclude piecel.h tinclude hourlyl.h

main() H {

Установка выходного формата

cout setiosflags(ios::showpoint) setprecision(2);



Строка

Boss Ь( John , Smith , 800.00);

создает объект b производного класса Boss и снабжает конструктор аргументами, включающими имя, фамилию и фиксированный еженедельный оклад.

Строка

ptr = &b; Указатель базового класса на объект

производного класса

помещает в указатель базового класса ptr адрес объекта производного класса Ь. Это то, что мы должны сделать для реализации полиморфного поведения.

Строка

ptr->print( ); динамическое связывание

вызывает функцию-элемент print того объекта, на который указывает ptr. Поскольку функция print объявлена в базовом классе как виртуальная, система вызывает функцию print объекта производного класса, как и положено при полиморфном поведении. Это обращение к функции является примером динамического связывания: функция вызывается через указатель базового класса, поэтому выбор того, какую функцию вызвать, откладывается до времени выполнения программы.

Строка

cout << заработал $ ptr->earnings(); Динамическое

связывание

вызывает функцию-элемент earnings того объекта, на который указывает ptr. Поскольку функция earnings объявлена в базовом классе как виртуальная, система вызывает функцию earnings объекта производного класса. Это также пример динамического связывания.

lfV;,j cout заработал $ h. earnings () ; Статическое

связывание

. cout endl;

return 0;

Рис. 10.1. Иерархия на основе абстрактного базового класса Employee (часть 11 из 12)

Администратор: John Smith заработал $800.00 Администратор: John Smith заработал $800.00 Служащий на комиссионных: Sue Jones заработал $650.00 *** Служащий на комиссионных: Sue Jones заработал $650.00

Служащий на сдельной оплате: Bob Lewis заработал $500.00 Служащий на сдельной оплате: Bob Lewis заработал $650.00 .,.:.. Служащий с почасовой оплатой: Karen Price заработал $550.00 Служащий с почасовой оплатой: Karen Price заработал $650.00

Рис. 10.1. Иерархия на основе абстрактного базового класса Employee (часть 12 из 12)



1 ... 202 203 204 [ 205 ] 206 207 208 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика