Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...
Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...
Топ:
Когда производится ограждение поезда, остановившегося на перегоне: Во всех случаях немедленно должно быть ограждено место препятствия для движения поездов на смежном пути двухпутного...
Процедура выполнения команд. Рабочий цикл процессора: Функционирование процессора в основном состоит из повторяющихся рабочих циклов, каждый из которых соответствует...
Характеристика АТП и сварочно-жестяницкого участка: Транспорт в настоящее время является одной из важнейших отраслей народного хозяйства...
Интересное:
Аура как энергетическое поле: многослойную ауру человека можно представить себе подобным...
Инженерная защита территорий, зданий и сооружений от опасных геологических процессов: Изучение оползневых явлений, оценка устойчивости склонов и проектирование противооползневых сооружений — актуальнейшие задачи, стоящие перед отечественными...
Распространение рака на другие отдаленные от желудка органы: Характерных симптомов рака желудка не существует. Выраженные симптомы появляются, когда опухоль...
Дисциплины:
2020-05-08 | 220 |
5.00
из
|
Заказать работу |
|
|
Класс 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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!