Навигация
Главная
Поиск
Форум
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
Модуль Forms 62834
Создание отчето... 62829
ТЕХНОЛОГИИ ДОСТ... 59362
Пример работы с... 58089
Имитационное мо... 54759
Реклама
Сейчас на сайте
Гостей: 11
На сайте нет зарегистрированных пользователей

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

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

Реклама



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

ПОДПИСЫВАЙСЯ на канал о программировании
Мультиметоды для классов, не являющихся родственниками
Теперь добавим третий класс и посмотрим, какие изменения придется внести в исходные классы:
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 21:21:19 · 0 Комментариев · 1863 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
GamesBase 3.0
Панель "Случайное...
XPcontrol
PBEditPack
Win-Prolog 3.618
Strawberry Prolog...
Программирование ...
AboutSystem
Rotolabel
Delphi на примерах
Abbrevia
CoolHints2k
DFileDeleter
CoolControls v3.0...
Сапёр
Просмотр коммент...
База Allsubmitter...
Info
Calendar
DiskInfo

Топ загрузок
Приложение Клие... 100422
Delphi 7 Enterp... 84987
Converter AMR<-... 20062
GPSS World Stud... 11985
Borland C++Buil... 11408
Borland Delphi ... 8388
Turbo Pascal fo... 7008
Visual Studio 2... 4985
Калькулятор [Ис... 4631
FreeSMS v1.3.1 3530
Случайные статьи
Далее перечислены ...
Как добавить новую...
NTLMvI при возможн...
Описание сообщений...
Шаблоны функций
Особенности функци...
Деструктор
Эротическое белье ...
Таблица хэшировани...
Касания и карты
IPSec
Динамический вызов...
Маниуляции с деревом
Выберите производи...
Клиент-серверное п...
Линейная сортировк...
Права пользователя...
Сп 118.13330.2012
База данных на пас...
Определение параме...
Решения к главе 15
Функция GetPalette...
4.4. Проблемы, св...
Содержание
Скорость процессора
Статистика



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


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