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

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

Моделирование интернет кафе на GPSS + Отчет
Медиа плейер на Delphi + Пояснительная записка
Моделирование литейного цеха на 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 Комментариев · 3037 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
DateEdit
Эффект лампы на р...
ИНТЕРНЕТ ПРОГРАММ...
KOL & MCK v1.69
ShadelLabel
Создание меню на ...
FreeSMS v1.3.1
PHP5. Профессиона...
Email
Применение жадног...
DiZsubmit
ActiveX в Delphi
БД сеть компьютер...
Цветной Grid
Allsubmitter 4.7 ...
SMLPack v1.0
Swat [Исходник на...
MicroGPSS Studen ...
Handles
Создание фракталов

Топ загрузок
Приложение Клие... 100795
Delphi 7 Enterp... 98040
Converter AMR<-... 20299
GPSS World Stud... 17061
Borland C++Buil... 14250
Borland Delphi ... 10377
Turbo Pascal fo... 7393
Калькулятор [Ис... 6084
Visual Studio 2... 5236
Microsoft SQL S... 3674
Случайные статьи
Управляющий термин...
File not open
Определение сложно...
Настройка фонового...
Контроль ошибок
Azartplay Casino
Как донести до кли...
Калгари (штат Альб...
Ускоренное умножение
Средства создания ...
Процедура SetUserC...
Введение
Файлы не подчиняю...
ESP-пакеты позволя...
Кто-то уже собирал...
S-Video
Кроме того, устано...
Аннотация
Б модуль
Приложения TCP/IP ...
Как перемещать кур...
Структура проекта
Кроме того, любая ...
Монтирование NFS
Регистрация параме...
Статистика



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


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