Навигация
Главная
Поиск
Форум
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
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Модуль Forms 65535
ТЕХНОЛОГИИ ДОСТ... 64129
Имитационное мо... 58783
Реклама
Сейчас на сайте
Гостей: 3
На сайте нет зарегистрированных пользователей

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

База данных студентов на Delphi (файл записей) + Блок схемы
Моделирование автовокзала + Отчет + Блок схема
Лабораторная работа по динамическим спискам на 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 Комментариев · 2556 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Разработка клиент...
Xrumer 4 Platinum...
C++ Стандартная б...
Библия хакера 2 К...
C++ Builder: Книг...
Программирование ...
DFileDeleter
Приемы программир...
Ehlib
Atb
AboutSystem
Простой пример ка...
Borland Delphi 6....
Prolog Interprete...
Delphi. Разработк...
Delphi 6 программ...
Анимированное поя...
PHP глазами хакера
Borland C++Builde...
Microsoft Press -...

Топ загрузок
Приложение Клие... 100497
Delphi 7 Enterp... 88602
Converter AMR<-... 20084
GPSS World Stud... 13987
Borland C++Buil... 12258
Borland Delphi ... 8760
Turbo Pascal fo... 7062
Visual Studio 2... 5007
Калькулятор [Ис... 4981
FreeSMS v1.3.1 3547
Случайные статьи
Оценка с точностью...
Добавление узлов в...
10.5. Принципы
Проверка состоятел...
Двоичный поиск на ...
Использование указ...
Ответы см
Обновление учетных...
Запрограммировать ...
Формат инфографиче...
5.1. Дополнительна...
PHP и Web. Кэширов...
Регистры последова...
Табл. 9-7.
Использование кома...
Применение класса ...
Изменение последов...
Песочные часы с вы...
Доставка грузов
Дополнительные нас...
Операторы цикла
Металлические опор...
Project
Политика хранения ...
client.cpp
Статистика



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


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