|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
Двойная диспетчеризация :)31.03.2013, 04:27. Показов 16033. Ответов 45
Метки нет (Все метки)
Здорова!
Я тут от пытаюсь понять такое понятие взаимодействия классов или хз как назвать, вообщем что такое двойная диспетчеризация. Так сказать. 4 статьи как бы так бегло прочитал но никак нимогу врубиться, что это такое. Кто может простыми словами объяснить, что это такое? Добавлено через 49 секунд Щас голова тяжолая фиг шо варит ![]() Добавлено через 1 минуту И еще хочу попытаться смоделировать на примере простых классов.
0
|
|
| 31.03.2013, 04:27 | |
|
Ответы с готовыми решениями:
45
Двойная сумма на C++ двойная табуляция |
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
| 31.03.2013, 10:22 | |
|
до кучи найдите книгу и прочитайте следующее:
Наиболее эффективное использование C++. 35 новых рекомендаций по улучшению ваших программ и проектов Автор: Скотт Мейерс Правило 31. Создавайте функции, виртуальные по отношению более чем к одному объектуhttp://rsdn.ru/res/book/cpp/most_effective_cpp.xml Сперва одинарная если ее так можно назвать: Классический пример. Имеем базовый класс Shape и производные от него. У Shape есть виртуальным метод Draw. В наследниках он как-то имплементится. Имея указатель на Shape вызываем Draw и за счет механизма работы виртуальных функций вызовится правильный метод отрисовки. Т.е. в этом случае не зная на какой именно объект указывает указатель, вызывается правильный метод. В двойное диспетчеризации нужно тоже самое, только для двух объектов. Т.е. имея два указателя на базовый классы и не зная, на какие именно объекты они ссылаются, нужно вызвать правильную функцию, которая обработала бы вызов в зависимости от конкретных типов этих двух объектов. В книге описывается столкновение двух объектов. В зависимости от типов объектов столкновения должны по разному обрабатываться. Т.е клиентский код выглядит как-то так: Object* obj1 = ... Object* obj2 = ... Process(obj1, obj2); Если объекты - астероиды - то это один способ обработки. Если объекты - астероид и космический корабль - другой способ. И т.д. Вот задача двойной диспетчеризации - это задача нахождения правильной функции обработки столкновения объектов.
3
|
|
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
||||||
| 31.03.2013, 13:00 | ||||||
|
Есть хороший пример на графических примитивов в каком-нибудь векторном графическом редакторе. Допустим, есть общий предок Shape, от которого наследуются Circle, Square и Triangle (круг, квадрат, треугольник). Нам надо уметь определить площадь пересечения двух фигур. Очевидно, математика такого пересечения зависит от того, какие именно фигуры пересекаются. Но вот сам рисунок представлен в виде коллекции указателей на Shape, где мы можем выбрать произвольно два объекта и поинтересоваться площадью их пересечения. Вот тут-то и вступает в дело двойная диспетчеризация:
3
|
||||||
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
||
| 31.03.2013, 13:12 [ТС] | ||
|
Добавлено через 2 минуты это называется полиморфизм. Добавлено через 6 минут У меня функция должна принимать два объекта типа Shape. Добавлено через 43 секунды И почему в производных классах от Shape функции виртуальные?
0
|
||
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
| 31.03.2013, 13:13 | |
|
А давайте не будем разбрасываться терминами без их чёткого понимания. Виртуальные функции - штатное воплощение механизма динамического полиморфизма в C++. То, что я показал - реализация двойной диспетчеризации посредством этого механизма.
2
|
|
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
||
| 31.03.2013, 13:14 [ТС] | ||
Добавлено через 56 секунд Nick Alte, Ок. Я еще подчитаю, а то я что такое виртуальная функция не сильно понимаю.
0
|
||
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
||
| 31.03.2013, 13:15 | ||
|
1
|
||
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
||
| 31.03.2013, 13:31 [ТС] | ||
|
(с определениями нада и правда разобраться) Добавлено через 1 минуту Щас протестирую можно ли для объекта класса с виртуальными функциями их вызвать. Добавлено через 9 минут Ладно тестить не будим просто вспомнил, что абстрактный класс это класс с чисто виртуальной функцией. Чисто виртуальная функция это тупо пустая функция которую нужно переопределить в производном классе. А просто виртуальная функция, это как обычная функция, токо с обязательным переопределением в производном классе. Вроде так.
0
|
||
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
||||||
| 31.03.2013, 13:31 | ||||||
|
Виртуальные функции вызываются "по факту", в зависимости от реального типа объекта. Отсюда и название (virtual переводится как "фактический"). Иллюстрация:
1
|
||||||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|||||||
| 31.03.2013, 13:34 | |||||||
|
ninja2,
1
|
|||||||
|
~ Эврика! ~
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
| 31.03.2013, 13:34 | |
|
Что-то как-то у вас всё сложно. Что такое двойная диспетчеризация поняли? Виртуальные функции — это реализация одинарной диспетчеризации. Принципиально она может быть сколько-угодно-арной.
1
|
|
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|||||||||||||||||
| 31.03.2013, 14:15 [ТС] | |||||||||||||||||
|
отак:
Добавлено через 5 минут Ладно понял для чоткой записи virtual оставляем. Спасибо всем щас буду на практике пробовать как чо работает. Добавлено через 4 минуты Щас я напишу простую программку реализующую двойную диспетчеризацию на примере Shape и производных Triangle, Square, и Rectangle. Зацените правильно ли сделал. Добавлено через 20 минут От написал ну чото это похоже на одинарную диспетчеризацию, яж ведь как бы одну функцию вызвал, только два объекта как параметры передал или это и есть двойная диспетчеризация?
По условию задачи нужно два объекта передавать. Но я так смотрю можно б и один параметр хз. Второй же объект в самом классе как бы известен.
0
|
|||||||||||||||||
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
| 31.03.2013, 18:00 | |
|
Передавать нужно по ссылке или по указателю, иначе создаётся копия объекта Shape, в которую заливают соответствующий кусок более крутого объекта. Чтобы избежать такой глупости, в Shape должны быть чистые виртуальные функции. Внимательно смотрим код моего примера.
1
|
|
|
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
|
|||||||
| 15.03.2021, 21:32 | |||||||
|
на примере непростых классов (нашла в сети)
Double dispatch лучше реализуется в Visitor pattern Добавлено через 28 минут хотя сам по себе паттерн призван решить некоторую громоздкость Double Dispatch (одна диспетчеризация в наследовании, 2я в перегрузке - и приходится перегружать всех членов - поэтому предпочтительнее декомпозировать и ввести посетителя - получится паттерн)... но всё-таки его цикличность надо ещё побороть... чтобы добиться нормального (расширяемого далее) дизайна... вообще, полагаю на данный момент std::visit и std::variant стали соотв. заменой в современном C++ Добавлено через 13 минут вот напомнило мне всё это то, что у меня есть концептуально... а потом подумала - а у меня ведь даже в страшном сне это не будет делаться динамически (по логике) - вздохнула с облегчением... статических классов пока хватает (по концепции моего т.н. тз)...
0
|
|||||||
|
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
|
|||||||
| 17.03.2021, 20:08 | |||||||
|
хм, действительно, полезная вещь -
P.S. single dispatcher
хотя с c++17 даже single dispetcher стал выглядеть совсем несложно
0
|
|||||||
|
611 / 416 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
|
||
| 17.03.2021, 23:37 | ||
|
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
| 18.03.2021, 01:05 | |||||||
1
|
|||||||
|
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
|
|
| 18.03.2021, 08:38 | |
|
не могу пройти мимо и не оставить линк для дальнейшего изучения - Использование double dispatch на примере разработки системы потокового вещания
![]() p.s. ... но всё-таки мне кажется, что паттерн Visitor в современном C++ упрощается ещё и использованием лямбд (в том же visit-variant)...
0
|
|
|
"C with Classes"
|
||
| 18.03.2021, 08:40 | ||
|
0
|
||
|
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
|
|
| 18.03.2021, 09:03 | |
|
del
0
|
|
| 18.03.2021, 09:03 | |
|
Помогаю со студенческими работами здесь
20
двойная буферизация Двойная буферизация на С++ двойная буферизация Двойная спираль в C++ двойная сортировка Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Рецензия / Мнение/ Перевод
https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs
. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|