|
Строитель
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 514
|
||||||
Что такое виртуальная функция и зачем она нужна?11.03.2017, 17:30. Показов 18244. Ответов 18
Метки нет (Все метки)
Мне с трудом пришлось понять, пока не прочитал книгу и не проработал код на виртуальных функциях.
В этой теме хочу новичкам рассказать, как я понял эту виртуальную функцию. И чтобы новички не тратили много времени, чтобы понять работу этой виртуальной функции. Виртуальная функция - это по сути тоже самое, что метод, процедура и т.д. Но этот метод может не запускаться. То есть вы вызываете метод, а он тупо не работает. За место него работает другой метод. Вы создаете виртуальную функцию, которая по названию совпадает с другим методом, находящимся в другом производном классе. То есть у Вас есть два одинаковых метода имеющие разный алгоритм действия. И программно в коде идет замена методов. Этот метод превращается в виртуальнуй, именно в классе(class). Когда Вы создаете класс и внутри класса создаете виртуальные методы. virtual void func1() А зачем нужны виртуальные методы(функции и процедуры)? Виртуальные методы нужны для того, чтобы делать подмену одной и той же функции. То есть программно вы делаете подстановку указателей и «вуаля», а метод работает уже по другому… Виртуальный метод становится полезным только тогда, когда нужно программно один и тот же метод менять по некоторому алгоритму в программном коде. Также чтобы сделать это потребуется создать класс + производный класс. И в двух классах сделать два одинаковых метода(функции). Один метод обозначить как виртуальный (virtual void func1()) Чтобы понять просто посмотрите на код с++ и станет понятно:
0
|
||||||
| 11.03.2017, 17:30 | |
|
Ответы с готовыми решениями:
18
Что такое рекурсия? Зачем она нужна? Что такое тестирующая программа и зачем она нужна? Что делает функция compare в коде и зачем она нужна в qsort |
| 11.03.2017, 17:33 | |
|
Не по теме: infobos, странная у вас подпись под ником)
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 11.03.2017, 17:42 | |
|
1
|
|
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
||||||
| 11.03.2017, 17:48 | ||||||
|
но вы не разобрали к примеру такой синтаксис
0
|
||||||
|
Строитель
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 514
|
|
| 11.03.2017, 17:50 [ТС] | |
|
0
|
|
|
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
|
||||||
| 11.03.2017, 18:03 | ||||||
|
Не происходит никакой подмены, метод родителя как существовал, так продолжает существовать:
0
|
||||||
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
|
| 11.03.2017, 18:10 | |
|
и ни слова об абстрактных классах, кажется вы не доконца поняли что такое виртуальные функции
1
|
|
|
Строитель
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 514
|
||
| 11.03.2017, 18:13 [ТС] | ||
|
Может быть Вы зададите задачу, где нужен будет абстрактный класс. Наверно тогда и все дружно поймем.
0
|
||
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
||
| 11.03.2017, 18:21 | ||
|
Класс, содержащий хотя бы одну чисто виртуальную функцию, считается абстрактным.
1
|
||
|
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 11.03.2017, 19:15 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Накатал тут своё объяснение, надеюсь никого не запутаю ещё сильнее
![]() Виртуальная функция нужна для обеспечения динамического полиморфизма. Если смотреть с высоты абстракций, виртуальные функции позволяют реализовывать общий интерфейс для разных объектов. Допустим, есть слудующая иерархия:
Если попытаться разобраться, как это всё работает, то без virtual оно и не должно работать. Если убрать все virtual из вышеприведённого кода и добавить реализацию функции в AbstractFigure, допустим так:
Если создать объект Triangle, он будет содержать все методы и поля AbstractFigure, в нашем случае метод draw и все свои методы и поля, поскольку у методов одинаковое название, Triangle скрывает метод базового класса и в следующем коде вызывается метод, рисующий треугольник:
А теперь добавим немного указателей, указатель - это просто ячейка памяти(обычно 64 бита), которая указывает на другую ячейку:
1
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
|
||
| 11.03.2017, 19:29 | ||
|
0
|
||
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
|
| 11.03.2017, 20:36 | |
|
ну по сути создавая виртуальные функции внутри класса, мы делаем его абстрактным, или как можно на него сказать "интерфейс", грубо говоря мы получаем интерфейс, т.е. те ниточки за которые мы можем дергать, вызывая один и тот же метод, но с разной реализацией для каждого отдельного класса наследника (или другими словами полиморфизм, один интерфейс - множество реализаций).
1
|
|
|
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
|
|
| 11.03.2017, 20:41 | |
|
GbaLog-,
Почему после твоего ника здесь стоит +?
0
|
|
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
||||||
| 11.03.2017, 20:43 | ||||||
|
К примеру, в моем говнокоде, я попытаюсь это показать:
1
|
||||||
| 11.03.2017, 20:44 | |
|
Не по теме: DevAlone, он типо у тебя в друзьяшках, а рядом с друзьями + ставится, насколько я понял
0
|
|
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
|
| 11.03.2017, 20:46 | |
|
0
|
|
| 11.03.2017, 21:24 | |
|
0
|
|
| 11.03.2017, 21:24 | |
|
Помогаю со студенческими работами здесь
19
Что такое виртуальная функция и абстрактный класс? Зачем нужна поддержка SLI/CrossFire и что она дает?
IPEndPoint - Что такое локальная конечная точка и для чего она нужна Что за функция, нужна ли она вообще?! Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|