Форум программистов, компьютерный форум CyberForum.ru

Практическое применение виртуальных функций - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Zealotec
0 / 0 / 0
Регистрация: 05.03.2011
Сообщений: 26
10.05.2012, 02:34     Практическое применение виртуальных функций #1
Собственно препод задал вопрос, рассказал ему все про механическую сторону вопроса, мол что такое, како й принцип, а на вопрос в теме ответить так и не смог, вот а теперь сам сижу и думаю...скажем так я не нашел отличие главное между обычными и виртуальными методами...он сказал, что это связано с таблицей виртуальных функций, в общем кто осведомлен в этом вопросе, прошу помощи
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,898
Завершенные тесты: 1
10.05.2012, 20:28     Практическое применение виртуальных функций #2
Практически виртуальные методы нужны для реализации динамического полиморфизма. Его общий принцип - это единообразная работа с разными объектами, имеющими разное поведение. Часто в пример приводят векторный графический редактор. Рисунок там состоит из набора различных фигур: Line, Rectangle, Ellipse, Curve и т.п. Каждая разновидность фигуры обладает собственным методом отрисовки. Но если мы сделаем все эти фигуры наследниками общего класса Shape, в котором есть виртуальный метод Draw, то мы сможем представить рисунок в виде набора указателей на Shape, причём каждый указатель в действительности указывает на фигуру того или иного типа, в зависимости от содержимого рисунка. Когда нам надо вывести рисунок на экран, мы проходимся по всем указателям и вызываем у них метод Draw, при этом для каждого объекта будет вызван его собственный метод, который правильно интерпретирует данные в объекте и правильно его рисует. Выбор именно того метода, что нужно, происходит благодаря тому, что метод Draw виртуальный.

Этот принцип (единообразная работа с объектами разных типов) наиболее чисто воплощается в концепции интерфейса. Мы определяем некий класс-предок, он же интерфейс, в котором содержатся общие операции и естественным образом ограничиваемся только перечисленными в этом предке операциями. Каждая операция задаётся в виде виртуальной функции, причём чистой: сама функция только объявлена в интерфейсе, но не реализована. Больше в интерфейсе нет ничего - ни данных, ни вспомогательных операций. От интерфейса наследуют классы, которые обязаны реализовать все операции интерфейса. Такие классы называются реализацией интерфейса. При создании объектов-реализаций указатели на них приводятся к базовому классу, после чего работа с ними происходит единообразно в рамках, заданных интерфейсом. Возможны случаи, когда конкретный тип объектов вообще скрывается от того, кто эти объекты использует (например, при загрузке из файла). Тогда всё, что известно программисту - только сам интерфейс, и работа может вестись только через перечисленные там операции.
Zealotec
0 / 0 / 0
Регистрация: 05.03.2011
Сообщений: 26
11.05.2012, 07:55  [ТС]     Практическое применение виртуальных функций #3
спасибо, я теперь не только объяснить могу, но и сам что-то понял
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
11.05.2012, 08:07     Практическое применение виртуальных функций #4
Цитата Сообщение от Zealotec Посмотреть сообщение
спасибо, я теперь не только объяснить могу, но и сам что-то понял
Еще важные слова: статический тип и динамический тип.
Статический тип - это при объявлении, а динамический тип - это во время работы.
Указатель, например, имеет статический тип базового класса, а динамический тип - наследника.
Виртуальные методы вызываются по динамическому типу, а обычные - по статическому.
Yandex
Объявления
11.05.2012, 08:07     Практическое применение виртуальных функций
Ответ Создать тему
Опции темы

Текущее время: 01:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru