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

1 ... 200 201 202 [ 203 ] 204 205 206 ... 342


EMPL0Y2.H

Абстрактный базовый класс Employee

fndef EMPL0Y2 H #define EMPL0Y2 H

class Employee { public:

Employee(const char *, const char *); -Employee();

const char *getFirstName() const; const char *getLastName() const;

Н

Чистые виртуальные функции абстрактного базового класса II Employee

virtual float earnings() const =0; чистая виртуальная

virtual void print() const = 0; чистая виртуальная

private:

char *firstName; char *lastName;

#endif

Рис. 10.1. Абарактный базовый класс Employee (часть 1 из 12)

заработная плата за часы, отработанные в основное время, и повышенная плата за часы, отработанные сверхурочно.

Вызов функции earnings используется для всех служаш;их. Но способы, которыми начисляется заработная плата, зависят, конечно, от классов слу-жаш;их и все эти классы являются производными от базового класса Employee. Поэтому функция earnings объявляется в базовом класса Employee как виртуальная, а соответствуюш;ие ее реализации обеспечиваются в каждом производном классе. Тогда, чтобы вычислить заработную плату какого-либо служащего, программа просто использует указатель базового класса на объект, соответствующий этому служащему, и вызывает функцию earnings. В реальной системе начисления заработной платы разные объекты служащих могли бы указываться отдельными элементами массива указателей типа Employee *. Программа могла бы просто проходить по этому массиву, используя указатели Employee * для вызов функций earnings каждого объекта.

Давайте рассмотрим класс Employee (рис. 10.1, части 1 и 2). Открытые функции-элементы включают: конструктор, который принимает в качестве аргументов имя и фамилию; деструктор, который освобождает динамически выделенную память; функцию доступа get, которая возвращает имя; функцию доступа get, которая возвращает фамилию; две чистые виртуальные функции earnings и print. Почему эти функции объявлены чистыми виртуальными? Ответ состоит в том, что не имеет никакого смысла реализовывать эти функции в классе Employee. Мы не можем начислять заработную плату абстрактному служащему: мы должны, сначала определить тип служащего; мы не можем также печатать заработную плату абстрактного служащего. Делая эти функции чистыми виртуальными, мы показываем, что они должны быть реализованы в производных классах, а не в базовом.



Глава 10

EMPL0Y2.CPP

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

абстрактного базового класса Employee

Замечание: не дается никаких определений чистых виртуальных функций ttinclude <iostream.h> #include <string.h> tinclude <assert.h> tinclude employ2.h

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

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

assert(firstName != 0);

strcpy(firstName, first);

lastName = new char[ strlen(last) assert(lastName != 0); strcpy(lastName, last);

проверка работы new

проверка работы new

Деструктор освобождает динамически выделенную память

Employee::-Employee()

delete delete

firstName; lastName;

Возвращение указателя на имя const char *Employee::getFirstName(

const

const препятствует модификации скрытых данных со стороны вызывающей программы.

Чтобы не допустить неопределенного указателя, вызывающая

программа должна копировать возвращаемую строку до того, как

деструктор освободит динамически выделенную область памяти

return firstName;

Вызывающая программа должна освободить память

Возвращение указателя на фамилию const char *Employee::getLastName() const (

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

return lastName;

Вызывающая программа должна освободить память

Рис. 10.1. Определения функций-элементов абарактного базового класса Employee

(чааь 2 из 12)



endif

Рис. 10.1. Класс Boss, производный от абстрактного базового класса Employee

(часть 3 из 12)

B0SS1.CPP

Определения функций-элементов класса Boss \ #include <iostream.h> iinclude bossl.h

II Конструктор класса Boss

loss::Boss(const char *first, const char *last, float s) 1 : Employee(first, last) вызов конструктора

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

{ setWeeklySalary(s) ; }

Установка еженедельного оклада для класса Boss void Boss :: setWeeklySalary (float s) { weeklySalary = s > 0 ? s : 0; }

Начисление заработной платы в классе Boss

float Boss:: earnings () const { return weeklySalary; }

It-! Печать имени служащего из класса Boss void Boss::print() const ф:. {

cout << endl << Администратор:

getFirstName() getLastName 0 ;

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

Класс Boss (рис. 10.1, части 3 и 4) является производным от класса Employee с открытым наследованием. Открытые функции-элементы включают: конструктор, который принимает в качестве аргументов имя, фамилию и еженедельный оклад, а также передает имя и фамилию конструктору Employee для инициализации элементов firstName и lastName той части объекта производного класса, которая совпадает с базовым классом; функцию set, которая присваивает новое значение скрытому элементу данных weeklySalary; виртуальную функцию earnings, в которой определено, как начис-

II B0SS1.H

- Класс Boss, производный от класса Employee #ifndef B0SS1 H #define B0SS1 H #include employ2.h

I class Boss : public Employee { public:

Boss(const char *, const char *, float = 0.0); void setWee)<;lySalary (float) ; virtual float earnings() const; \Щ virtual void print () const; -vate:

float weeklySalary;



1 ... 200 201 202 [ 203 ] 204 205 206 ... 342

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