Навигация
Главная
Поиск
Форум
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
Реклама
Сейчас на сайте
Гостей: 21
На сайте нет зарегистрированных пользователей

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

Калькулятор на Delphi с переводом в другую систему исчисления + Блок схемы
Информационная система - транспортный парк на Turbo Pascal (База данных)...
Моделирование круглосуточного интернет кафе на GPSS + Отчет

Мультиметоды для классов, не являющихся родственниками
Теперь добавим третий класс и посмотрим, какие изменения придется внести в исходные классы:
class Derived_c: public Base { public:
virtual bool Operator(const Base &R)const { return R.Operator(*this); } virtual bool Operator(const Derived_a &R)const { cout << "C-A" << endl; return true; } virtual bool Operator(const Derived_b &R)const { cout << "C-B" << endl; return true; } virtual bool Operator(const Derived_c &R)const { cout << "C-C" << endl; return true; }
};



Этот класс реализует нам операцию с левым операндом типа Derived_c. Отметим, что ни класс Deri ved_a, ни класс Deri ved_b не работают с аргументом типа Derived_c. Не будем вносить никаких изменений в эти классы и выполним небольшой фрагмент программы:
Derived_a A; Derived_b В; Derived__c С; Base &гА = А; Base &гВ = В; Base &гС = С;
cout << A.Operator(C) << endl; cout << В.Operator(С) << endl; cout << rA.Operator(rC) << endl; cout << rB.Operator(rC) << endl;



Никаких ошибок компиляции нет! Несмотря на то, что мы не определяли в классах Derived_a и Derived_b операции с аргументом типа Derived_c, следующие вызовы не вызывают ошибок компиляции:
cout << A.Operator(С) << endl; cout << В.Operator(С) << endl;



Причина в том, что в данном случае работает принцип подстановки. Ввиду отсутствия-метода с аргументом типа Derived_c выбирается метод класса с параметром-ссылкой базового типа и на его место подставляется ссылка на наследника. Далее выполняется механизм двойной диспетчеризации. Точно так же работают вызовы:
cout << rA.Operator(rC) << endl; cout << rB.Operator(rC) << endl;



Если нас это устраивает, никаких изменений в классы Derived_a и Derived_b вносить нет необходимости. Если же требуется специальный вид операции A. Operator (С), то нужно добавить соответствующий виртуальный метод в класс Deri ved__a.
Как уже было сказано, подобная методика работает и для классов, не являющихся родственниками. Построим следующую иерархию классов (листинг 10.11).

Листинг 10.11. Мультиметоды для классов, не являющихся родственниками
class В; // объявление корня второй иерархии
class А // корень первой иерархии
{ public: virtual ~А(){}
virtual void Operator(В*)=0:
}:
class D1A; // объявления классов первой иерархии
class D2A;
class В // корень второй иерархии
{ public:
virtual void Operator(D1A& rA) = 0: virtual void Operator(D2A& rA) = 0:
};
// классы иерархии A class D1A: public A { public:
virtual void 0perator(B* R) { R->0perator(*this); }
};
class D2A: public A { public:
virtual void 0perator(B* R) { R->0perator(*this); }
}:
// классы иерархии В class DIB: public В { public:
virtual void Operator(D1A& rA) { cout << "D1A!" << endl: }; virtual void Operator(D2A& rA) { cout << "D2A!" << endl; };
};
class D2B: public В { public:
virtual void Operator(D1A& rA) { cout << "D1A!" << endl; }; virtual void Operator(D2A& rA) { cout << "D2A!" << endl; };
};



Две иерархии — А и В — не имеют общих родственников. Тем не менее методика последовательных виртуальных вызовов, описанная ранее для одной иерархии, работает точно так же. В данном случае все требуемые действия реализованы во второй иерархии, а первая только осуществляет первый шаг двойного переключения по типу. Небольшой фрагмент программы иллюстрирует необходимые переключения:
D1A al; D2A а2;
В *pb = new D1B(); // указатель на базовый класс <- адрес наследника
al.Operator(pb); // работают 2 виртуальных вызова
а2.Operator(pb); // работают 2 виртуальных вызова

pb->0perator(al); pb = new D2B(); al.Operator(pb); a2.Operator(pb); pb->Operator(al);

// работает 1 виртуальный вызов
// работают 2 виртуальных вызова // работают 2 виртуальных вызова // работает 1 виртуальный вызов




Двойное переключение по типу это основа паттерна Visitor (посетитель). Это — один из наиболее трудных для понимания паттернов, недаром в [17] он описан последним.

Немного о кофемашинах для программистов


Как же великолепен терпкий запах кофе, который был свежесварен. Можно сидеть над чашкой часами и вдыхать данный просто божественный аромат. С давних времен считается, что кофе – это напиток для настоящих эстетов. Он согревает и душу и тело. Дарит блаженство и обостряет чувства. Уже давно ушли те времена, когда люди варили кофе в капельных кофеварках или турках. Их вытеснили различные кофемашины http://coffee-man.com.ua/, которые помогают экономить не только лишь время, но и количество совершенных действий. Посредством центробежной силы молотый кофе попадает в заварную группу, куда и поступает пар под определенным давлением. И уже через минуту можно пить вкуснейший свежесваренный кофе, который абсолютно не теряет своих качеств.
Вы уже давно подумываете над покупкой кофемашины себе домой либо в офис. Однако при этом, ваш бюджет ограничен, а вы так хотите наслаждаться свежеприготовленным настоящим капучино либо эспрессо не выходя из дома?
В нашем интернет магазине по продаже кофе и разных кофемашин, вы найдете качественные б/у кофемашины и кофеварки по низким ценам.
Обширный ассортимент наших машин http://coffee-man.com.ua/catalog/bu и кофеварок регулярно обновляется. Даже если вы не нашли тут на нашем сайте кофемашину, которая интересует вас, тогда звоните и наши менеджеры обязательно проконсультируют вас по всевозможным аналогам и закажут для вас подходящий вариант кофемашины из-за границы.
Опубликовал Kest December 04 2013 17:21:19 · 0 Комментариев · 2573 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
TDBF
Animation (Пример...
Мод "проверочный ...
Модифицированная ...
Calendar
IMtale
Алгоритмы шифрова...
Керниган Б.В., Ри...
AlignEdit
CwstatusBar
Пример клиента ФТ...
Шаблон для новост...
XPcontrol
AUTOWEB
BIOS
Szwavepanel
Советы от Даниилы...
Calendar
Векторный редакто...
JanReplace

Топ загрузок
Приложение Клие... 100772
Delphi 7 Enterp... 97809
Converter AMR<-... 20261
GPSS World Stud... 17014
Borland C++Buil... 14189
Borland Delphi ... 10267
Turbo Pascal fo... 7372
Калькулятор [Ис... 5972
Visual Studio 2... 5206
Microsoft SQL S... 3661
Случайные статьи
сервера и сведения...
Безопасность сети ...
Ручная и автомати...
Создание собственн...
Глава 5 Стоимос...
Что делать, если п...
Подготовка и публи...
Выбор формата файл...
Этап 3 - сколемизация
Язык С и С++: массивы
Модуль RIM и его д...
6.5. Дополнительна...
Конфигурации сетей...
ТАБЛИЦЫ В GPSS
наследования ОГП
Листинг 5.5. Автом...
Windows: щелкните ...
Интерфейс между ко...
В словаре, который...
Системные включаем...
Особенности постро...
Далее находится об...
МОРФОГЕНЕЗ И ЕГО М...
Звуковая карта
3.1. Структуры и ...
Статистика



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


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