Конструкторы класса DistSign — КиберПедия 

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

Конструкторы класса DistSign

2020-05-08 220
Конструкторы класса DistSign 0.00 из 5.00 0 оценок
Заказать работу

Класс DistSign имеет два конструктора, таких же, как и класс Distance. Первый не имеет аргументов, у второго либо два, либо три аргумента. Третий, необязатель­ный, аргумент второго конструктора — это переменная sign, имеющая значение pos или neg. Значением по умолчанию является pos. Эти конструкторы позволя­ют нам определить объекты типа DistSign разными способами.

Оба конструктора в классе DistSign вызывают соответствующие конструкто­ры из класса Distance для установки значений футов и дюймов. Они также уста­навливают значение поля sign. Конструктор без аргументов всегда устанавлива­ет значение поля sign равным pos. Второй конструктор устанавливает значение поля sign как pos, если оно не определено.

Аргументы ft и in, передающиеся из функции main() второму конструктору класса DistSign, просто передаются конструктору класса Distance.

 

Методы класса DistSign

Добавление поля sign в класс Distance имеет значение для обоих его методов. Метод getdist() класса DistSign должен послать запрос пользователю о знаках значений футов и дюймов. Метод showdist() должен вывести знаки для футов и для дюй­мов. Эти методы вызывают соответствующие методы из класса Distance в строках

Distance::getdist (); и

Distance::showdist ():

Вызовы получают и выводят значения футов и дюймов. Затем методы getdist() и showdist() класса DistSign продолжают работу с полем sign.

 

В поддержку наследования

С++ разработан для того, чтобы создание производных классов было эффектив­ным. Мы легко можем использовать лишь части базового класса: данные, конст­рукторы или методы, затем добавить нужные нам возможности и создать новый, улучшенный класс. Заметим, что в программе ENGLEN мы не применяли дублика­ты кода, а вместо этого использовали подходящие методы базового класса.

 

Иерархия классов

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

В качестве примера рассмотрим базу данных служащих некоторой компа­нии. Для упрощения ситуации в ней существует только три категории служа­щих: менеджеры, занятые управлением, ученые, занятые исследованиями и раз­работкой товара компании, и рабочие, занятые изготовлением товара.

В базе данных хранятся имена служащих всех категорий и их идентифика­ционные номера. Однако в информации о менеджерах содержится еще и назва­ние их должности и их взносы в гольф-клубы, а в информации об ученых — количество опубликованных статей.

Пример нашей программы начинается с описания базового класса employee. Этот класс содержит фамилии служащих и их номера. Он порождает три новых класса: manager, scientist и laborer. Классы manager и scientist содержат добавоч­ную информацию об этих категориях служащих.

Далее рассмотрим листинг программы EMPLOY:

// employ.срр

// пример написания базы данных сотрудников с использованием наследования

#include <iostream>

using namespace std;

const int LEN = 80;    // максимальная длина имени

///////////////////////////////////////////////////////////

class employee // некий сотрудник

{

private:

char name[ LEN ]; // имя сотрудника

unsigned long number; // номер сотрудника

public:

void getdata () {

cout << "\n Введите фамилию: ";

cin >> name;

cout << " Введите номер: ";      

cin >> number;

}

void putdata () const {

cout << "\n Фамилия: " << name;

cout << "\n Номер: " << number;

}

};

///////////////////////////////////////////////////////////

class manager: public employee // менеджер

{

private:

char title[ LEN ]; // должность, например вице-президент

double dues;    // сумма взносов в гольф-клуб

public: void getdata () {

employee::getdata ();

cout << " Введите должность: ";

cin >> title;

cout << " Введите сумму взносов в гольф-клуб: ";

cin >> dues;

}

void putdata () const {

employee::putdata ();

cout << "\n Должность: " << title;

cout << "\n Сумма взносов в гольф-клуб: " << dues;

}

};

///////////////////////////////////////////////////////////

class scientist: public employee // ученый

{

private:

int pubs; // количество публикаций

public:

void getdata () {

employee::getdata ();

cout << " Введите количество публикаций: ";

cin >> pubs;

}

void putdata () const

{

employee::putdata ();

cout << "\n Количество публикаций: " << pubs;

}

};

 ///////////////////////////////////////////////////////////

class laborer: public employee // рабочий

{

};

///////////////////////////////////////////////////////////

int main ()

{

manager m1, m2;

scientist s1;

laborer l1;

// введем информацию о нескольких сотрудниках

cout << endl;

cout << "\nВвод информации о первом менеджере";

m1.getdata ();

cout << "\nВвод информации о втором менеджере";

m2.getdata ();

cout << "\nВвод информации о первом ученом";

s1.getdata ();

cout << "\nВвод информации о первом рабочем";

l1.getdata ();

// выведем полученную информацию на экран

cout << "\nИнформация о первом менеджере";

m1.putdata ();

cout << "\nИнформация о втором менеджере";

m2.putdata ();

cout << "\nИнформация о первом ученом";

s1.putdata ();

cout << "\nИнформация о первом рабочем";

l1.putdata ();

cout << endl;

return 0;

}

В функции mainQ этой программы объявлены четыре объекта различных классов: два объекта класса manager, объект класса scientist и объект класса laborer. (Конечно, объектов могло быть много больше, но при этом вывод про­граммы стал бы довольно объемным.) Они вызывают метод getdata() для полу­чения информации о каждом из служащих и метод putdata(), обеспечивающий вывод этой информации. Рассмотрим простое взаимодействие с программой EMPLOY. Сначала пользователь вводит данные.

Ввод информации о первом менеджере Введите фамилию: Иванов Введите номер: 1 Введите должность: директор Сумма взносов в гольф-клуб: 10000

Ввод информации о втором менеджере Введите фамилию: Парнашвили Введите номер: 7

Введите должность: заместитель директора

Сумма взносов в гольф-клуб: 15000 Ввод информации о первом ученом

Введите фамилию: Подрезов

Введите номер: 1В

Введите количество публикаций: 54 Ввод информации о первом рабочем

Введите фамилию: Сидорук

Введите номер: 1634 Затем программа выводит введенную информацию. Информация о первом менеджере

Фамилия: Иванов

Номер: 1

Должность: директор Сумма взносов в гольф-клуб: 10000 Информация о втором менеджере Фамилия: Парнашвили Номер: 7

Должность: заместитель директора Сумма взносов в гольф-клуб: 15000 Информация о первом ученом Фамилия: Подрезов Номер: 18

Количество публикаций: 54 Информации о первом рабочем Фамилия; Сидорук Номер: 1634

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

 

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

Заметим, что мы не определяли объекты класса employee. Мы использовали его как общий класс, единственной целью которого было стать базовым для произ­водных классов.

Класс laborer выполняет те же функции, что и класс employee, так как не име­ет никаких отличий от него. Может показаться, что класс laborer в данном слу­чае лишний, но, создав его, мы подчеркнули, что все классы имеют один источ­ник — класс emlployee. Кроме того, если мы захотим в будущем модифицировать класс laborer, то нам не потребуется делать изменения в классе employee.

Классы, использующиеся только как базовые для производных, например как employee в программе EMPLOY, иногда ошибочно называют абстрактными классами, подразумевая, что у этого класса нет объектов. Однако термин абст­рактный имеет более точное определение, и мы это увидим в главе 11 «Вирту­альные функции».

Ни в базовом, ни в производном классах нет конструкторов, поэтому компиля­тор, наталкиваясь на определения типа

manager ml, m21:

использует конструктор, установленный по умолчанию для класса manager, вы­зывающий конструктор класса employee.

Методы getdata() и putdata() класса employee принимают от пользователя имя и номер и выводят их на дисплей. Методы getdata() и putdata() классов manager и scientist используют одноименные методы класса employee и проделывают свою работу. Метод getdata() класса manager запрашивает у пользователя долж­ность и сумму взносов в гольф-клуб, a putdata() выводит эти значения. В классе scientist эти методы оперируют значением количества публикаций.

 


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

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...

Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.025 с.