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

1 ... 187 188 189 [ 190 ] 191 192 193 ... 342



EMPLOY.СРР

Определения функций-элементов класса Employee. #include <string.h> #include <iostream.h> #include <assert.h> #include employ.h

J Конструктора динамически распределяет память для имени I и фамилии и использует strcpy для их копирования в объект. Employee::Employee(const char *first, const char *last) {

firstName = new char[ strlen(first) + 1 ];

assert(firstName != 0); завершение, если память

.1 не выделена

strcpy (firstName, first);

lastName = new char[ strlen(last) + 1 ];

assert(lastName != 0); завершение, если память

Ч ?**; не выделена

strcpy(lastName, last);

Вывод имени служащего void Employee::print() const

{ cout firstName lastName; }

Щ I/ Деструктор освобождает динамически выделенную память Employee::-Employee() {

delete [] firstName; освобождение динамической памяти

delete [] lastName; освобождение динамической памяти

Рис. 9.5. Определения функций-элементов класса Employee (часть 2 из 5)

HOURLY.н . Определение класса HourlyWorker

Sf #ifndef HOURLY H

#define HOURLY H -

i! iinclude employ.h

class HourlyWorker : public Employee { . pu.olic:

HourlyWorker(const char*, const char*, float, float); float getPayO const; вычисление и возвращение

зарплаты

void print О const; переопределенная печать

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

private:

float wage; зарплата за час

float hours; рабочие часы за неделю

#endif



Поскольку данные класса Employee имеют тип private, доступ к данным возможен только посредством функции-элемента print, которая просто выводит имя и фамилию служащего. Функция деструктор возвращает системе динамически выделенную память.

HOURLY B.CPP

Определения функций элементов класса HourlyWorker #include <iostream.h> #include <iomanip.h> #include hourly.h

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

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

float initHours, float initWage) : Employee(first, last) вызов конструктора

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

hours = initHours; wage = initWage;

получение оплаты HourlyWorker

float HourlyWorker::getPay() const { return wage * hours; }

печать имени и оплаты void HourlyWorker::printО const

cout HourlyWorker::print о endl;

Employee::print 0; вызов функции print базового класса

4 cout является рабочим почасовиком с оплатой iff $ setiosflags (ios:: fixed I ios:: showpoint)

<< setprecision(2) getPayO endl;

)

Рис. 9.5. Определения функций-элементов HourlyWorker (часть 4 из 5) FIG9 5.СРР

Переопределение функции-элемента базового класса / i в производном классе tinclude <iostream.h> #include hourly.h

main О

0. HourlyWorker h( Боб , Смит , 40.0, 7.50); h. print ( ); return 0;

: HourlyWorker::print()

i Боб Смит является рабочим почасовиком с оплатой $300.00

Рис. 9.5. Переопределение функции-элемента базового класса в производном классе

(чааь 5 из 5)



9.7. Открытые, защищенные и закрытые базовые

классы

При порождении класса из базового класса этот базовый класс может наследоваться как public, protected или private. Защищенное и закрытое наследования встречаются редко и каждое из них нужно использовать с большой осторожностью; в этой книге мы используем только открытое наследование.

При порождении класса как public открытые элементы базового класса становятся открытыми элементами производного класса, а защищенные элементы базового класса становятся защищенного элементами производного класса. Закрытые элементы базового класса никогда не бывают доступны для производного класса.

Класс HourlyWorker (рис. 9.5, часть 3) наследует классу Employee путем открытого наследования. Это указано в первой строке определения класса в следующем виде:

class HourlyWorker : public Employee

Открытый интерфейс HourlyWorker включает функцию print класса Employee и функции-элементы getPay и print класса HourlyWorker. Обратите внимание, что класс HourlyWorker определяет свою собственную функцию print. Поэтому класс HourlyWorker имеет доступ к двум функциям print. Класс HourlyWorker содержит также закрытые данные-элементы wage и hours для вычисления недельной зарплаты служащих.

Конструктор класса HourlyWorker (рис. 9.5, часть 4) использует список инициализаторов элементов для передачи строк first и last конструктору класса Employee для задания начальных значений элементам базового класса, а затем задает начальные значения элементам wage и hours. Функция-элемент getPay вычисляет зарплату HourlyWorker.

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

Employee::print();

Поскольку функции базового класса и производного класса имеют одинаковые имена и сигнатуры, функции базового класса должно предшествовать имя класса и операция разрешения области действия. В противном случае вызовется опять версия функции производного класса, что приведет к бесконечной рекурсии (функция print класса HourlyWorker будет вызывать сама себя).



1 ... 187 188 189 [ 190 ] 191 192 193 ... 342

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