Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 9
На сайте нет зарегистрированных пользователей

Пользователей: 13,361
новичок: uehuat
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Моделирование работы узла коммутации сообщений на GPSS + Пояснительная з...
База данных студентов на Turbo Pascal (Списки) + Пояснительная записка
Информационная система - продуктовый магазин на Turbo Pascal (База данны...

Простое открытое наследование
Вернемся к разработке класса денег. Ранее мы реализовали простой класс, позволивший нам выполнять операции с рублями (см. главы 1 и 2). Однако практически в любой финансовой системе необходимо оперировать и другой валютой, например долларами или франками. Давайте рассмотрим мультивалютную систему, в которой используются рубли, доллары и евро. Понятно, что разные валюты обладают некоторыми общими свойствами, поэтому можно использовать механизм наследования. Однако так как мы пока не имеем опыта применения механизма наследования, нам, очевидно, наряду с разработкой классов-наследников потребуется время от времени модифицировать базовый класс.
Совершенно ясно, что арифметические операции с любой валютой — одни и те же: нам надо складывать и вычитать деньги, делить деньги на деньги, умножать и делить деньги на число. Даже операция ввода может быть унифицирована, так как практически для всех валют (по крайней мере, для долларов и евро) каждый «рубль» состоит ровно из 100 «копеек». Различия проявляются только при выводе денежной суммы на экран — необходимо указывать, в какой валюте эта денежная сумма представлена. Таким образом, мы можем реализовать базовый класс TCurrency, в котором определено поле для денежной суммы и реализованы все перечисленные операции, кроме операции вывода. Тогда конкретную валюту (рубли, доллары или евро) можно будет реализовать путем открытого наследования. Интерфейс этого класса представлен в листинге i8.1. Реализация не изменяется, за исключением названия класса, поэтому приводить мы ее не будем.
Листинг 8.1. Интерфейс базового класса TCurrency для работы с денежными суммами
class TCurrency { public:
typedef unsigned int uint;
TCurrency(const long double &t=0.0); // конструктор
// методы
TCurrency& operator+=(const TCurrency &b); TCurrency operator-() { Summa = -Summa; return *this; }; TCurrency& operator++(){ return (*this+=1.0);} TCurrency operator++(int)
{ TCurrency t = *this; *this+=0.01; return t; }
TCurrency operator-(const TCurrency &a);
TCurrency& operator-=(const TCurrency &b);
TCurrency& operator/=(const double &b);
long double operator/(const TCurrency &b);
TCurrency operator/(const double &b);
TCurrency& operator*-(const double &b);
bool isNegative() { return (Summa < 0); } // дружественные функции
friend TCurrency operator+(const TCurrency &a, const TCurrency &b);
friend TCurrency operator*(const long double &a, const TCurrency &b);
friend TCurrency operator*(const TCurrency &a, const long double &b);
friend bool operator==(const TCurrency &a, const TCurrency &b);
friend bool operator!=(const TCurrency &a,const TCurrency &b);
friend bool operator<(const TCurrency &a,const TCurrency &b);
friend bool operator>=(const TCurrency &a,const TCurrency &b);
friend bool operator>(const TCurrency &a,const TCurrency &b);
friend bool operator<=(const TCurrency &a,const TCurrency &b);
friend istream& operator>>(istream& t, TCurrency &r); private:
long double Summa;
string toStringO const;
long double round(const long double &r);
};



Разберемся, какие дополнения или изменения придется внести в классы-наследники. Во-первых, это, конечно, операция вывода на экран. При этом наша приватная функция перевода числа в символьный вид может быть реализована в базовом классе, так как она должна работать одинаково для трех валют. Напишем первый вариант наших классов-наследников (листинг 8.2).
Листинг 8.2. Классы-наследники от TCurrency
// Рубли
class Roubles: public TCurrency { public:
friend ostream& operator<<(ostream& t, const Roubles &r);
};
ostream& operator<<(ostream& t, const Roubles &r)
{ string s = r.toStringO; return (t << s << "p."); }
// Доллары
class Bucks: public TCurrency { public:
friend ostream& operator<<(ostream& t, const Bucks &r);
*' продолжение &
Листинг 8.2 (продолжение)
ostream& operator<<(ostream& t, const Bucks &r)
{ string s = r.toStringO; return (t << s << "$"); }
// Евро
class Euros: public TCurrency { public:
friend ostream& operator<<(ostream& t, const Euros &r);
>:
ostream& operator<<(ostream& t, const Euros &r)
{ string s = r.toStringO: return (t << s << "evro"): }



Однако при трансляции тут же выясняется, что фуйкция toStringO недоступна в производных классах, так как в базовом классе она определена в приватной части. Поэтому необходимо создать в базовом классе секцию protected и перенести туда прототип функции toStringO:
class TCurrency { ^public:
typedef unsigned int uint:
TCurrency(const long double &t=0.0); // конструктор
// методы // . . .
// дружественные функции
// ... protected:
string toStringO const: private:
// . ..
};



Так как все три класса практически пока одинаковые, будем разбираться с нюансами открытого наследования, экспериментируя с рублями и модифицируя базовый класс, если это потребуется.
Опубликовал Kest November 14 2013 23:35:42 · 0 Комментариев · 3448 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Rotolabel
Программа рисует ...
PHP: обучение на ...
AboutSystem
Trojan [Исходник ...
ProLIB18
Delphix Sample [И...
Как программирова...
База англоязычных...
Просмотр файлов и...
SMLPack v1.0
39 статьи по Delphi
Игра в крестики н...
Adapter (пример D...
ATComponents
Indy in Depth Глу...
Редактор анимаций
ComboBox97
Развивающийся фла...
DirHTMLReportBuil...

Топ загрузок
Приложение Клие... 100771
Delphi 7 Enterp... 97788
Converter AMR<-... 20259
GPSS World Stud... 17014
Borland C++Buil... 14186
Borland Delphi ... 10267
Turbo Pascal fo... 7372
Калькулятор [Ис... 5968
Visual Studio 2... 5205
Microsoft SQL S... 3661
Случайные статьи
Логический тип
Глава 23. Прави...
Свойства Dynamic HTML
Разрешение дублиро...
Временные файловые...
BEGIN expected
Как открывать файл...
Листинг 9.8. Двоич...
0 необходимо приоб...
Реагирование на со...
Стандартные процед...
Invalid ordering o...
Глава 10. Кратк...
Доставка готовой е...
ЦС предприятия нео...
Функция GetGraphMo...
Колесо трактор
Соединения должны ...
Получение XML-схем...
БК Parimatch Betgames
Список алгоритмов ...
Несколько слов о п...
ОПЕРАТОРЫ ОПИСАНИЯ...
Генерирование сигн...
Оригинальная полно...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?