Навигация
Главная
Поиск
Форум
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
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Содержание сайт... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Создание отчето... 65438
Модуль Forms 65201
Пример работы с... 64425
ТЕХНОЛОГИИ ДОСТ... 61857
Имитационное мо... 57766
Реклама
Сейчас на сайте
Гостей: 5
На сайте нет зарегистрированных пользователей

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

Информационная система - продуктовый магазин на Turbo Pascal (База данны...
Моделирование процесса поступления заявок в систему, состоящую из трёх Э...
Лабораторная работа по динамическим спискам на Turbo Pascal (удаление ду...

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Простое открытое наследование
Вернемся к разработке класса денег. Ранее мы реализовали простой класс, позволивший нам выполнять операции с рублями (см. главы 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 15 2013 03:35:42 · 0 Комментариев · 2430 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
PRNDbgrid
Редактор текста (...
CoolHints2k v1.03
CaptionButton
AlnComponents
Доступа к БД Fire...
Векторный редакто...
EditButton
PBEditPack
Fig [Исходник на ...
Сапёр
DemoEdit [Исходни...
MiniTetris [Исход...
Технология .Net в VB
Разработка клиент...
FreeSMS v1.3.1
Панель поиска
Preview
Abc_component
C++ для начинающих

Топ загрузок
Приложение Клие... 100470
Delphi 7 Enterp... 87060
Converter AMR<-... 20078
GPSS World Stud... 12822
Borland C++Buil... 11835
Borland Delphi ... 8604
Turbo Pascal fo... 7039
Visual Studio 2... 4999
Калькулятор [Ис... 4800
FreeSMS v1.3.1 3542
Случайные статьи
Имейте достаточно ...
Too many symbols
Изменение размера ...
Получение цифровог...
Простой шаблон для...
Интерфейс аппаратн...
Бесплатные объявления
Users And Computer...
Как работать с абз...
Создание справочно...
Решение задачи, ис...
Синтаксис регулярн...
Социативный массив...
Клиент для LiveJou...
Как купить комнату...
Использование «умн...
Программа Stufflt ...
ОБРАЗОВАНИЕ ПЕРВОГ...
Странные эффекты
Процедура Bar - за...
Благодарности ко в...
Распределение конц...
Случаи применения ...
Запрос дерева со С...
Видео-покер и казино
Статистика



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


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