96 / 96 / 21
Регистрация: 25.04.2012
Сообщений: 449
|
|
1 | |
virtual функции07.02.2013, 18:20. Показов 5528. Ответов 32
Метки нет (Все метки)
я как-то пропустил лекцию по этой теме, и теперь совсем не понимаю назначение этих функций.
может кто поделиться ссылкой и нормальными примерами по этой теме? и да, я умею пользоваться гуглом, и вводил "virtual функции с++", читал, и не понял ничего
0
|
07.02.2013, 18:20 | |
Ответы с готовыми решениями:
32
Virtual функции и наследование Protected abstract virtual base pure virtual private destructor Возвращаемое значение virtual функции Про перегрузку функции и Virtual в классах |
433 / 368 / 149
Регистрация: 06.08.2012
Сообщений: 961
|
||||||
07.02.2013, 18:39 | 3 | |||||
Если вы не используете наследование, приминение виртуальных функций безсмысленно.
http://ru.wikipedia.org/wiki/Виртуальный_метод Вот нашёл в интернете (ПИСАЛ НЕ Я): Наглядный пример.
Если убрать слово virtual, то на экран будет выведено "AA". То есть несмотря на то, что у вас указатель на класс A, вызовется метод НАСЛЕДНИКА!!!
0
|
229 / 76 / 9
Регистрация: 03.02.2013
Сообщений: 311
|
|
07.02.2013, 18:47 | 4 |
Tiva, если функцию объявить виртуальной (virtual) и перегрузить её в классе(ах)-потомке(ах), то при её вызове, через указатель на базовый класс, будут вызываться вызываться именно та версия функции, которая определена в классе-потомке. Иначе была бы вызвана та версия, которая определена в базовом классе....
P.S. если Вам не известны некоторые слова, которые я использовал для объяснения, то курите маны
0
|
96 / 96 / 21
Регистрация: 25.04.2012
Сообщений: 449
|
|
07.02.2013, 18:57 [ТС] | 5 |
да слова-то мне все известны... я вот не понимаю...
есть класс А, в нем функция виртуальна. в классе В она переопределена. и запись A->функция вызовет функцию из B? а если в классе С она тоже переопределена, как он определит какую вызвать?
0
|
229 / 76 / 9
Регистрация: 03.02.2013
Сообщений: 311
|
||||||
07.02.2013, 19:12 | 7 | |||||
Tiva, так, ещё раз....
1
|
229 / 76 / 9
Регистрация: 03.02.2013
Сообщений: 311
|
||||||
07.02.2013, 19:26 | 9 | |||||
А вот Вам пример с утечкой памяти. Скомпилируйте так. А потом сотрите "virtual", и поймёте где появилась утечка.
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
07.02.2013, 19:47 | 10 |
Пёс, Во первых, никакой утечки памяти нет. Во вторых - не нужно писать такие вещи
и уж тем более приводить их в пример новичкам.
0
|
229 / 76 / 9
Регистрация: 03.02.2013
Сообщений: 311
|
||||||
07.02.2013, 19:56 | 11 | |||||
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
||||||
07.02.2013, 19:58 | 12 | |||||
Вы свой предыдущий пример видели? Например строчку
0
|
229 / 76 / 9
Регистрация: 03.02.2013
Сообщений: 311
|
|
07.02.2013, 20:00 | 13 |
Пишу как в книгах
Добавлено через 1 минуту 1. Код рабочий. 2. Видел свой предыдущий пример. Советую Вам к тому примеру ещё приписку почитать сверху.
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
07.02.2013, 20:05 | 15 |
Нет, не рабочий, он не скомпилируется как минимум в GCC.
Когда читал, не увидел последнюю фразу, ее или не было тогда, или я просмотрел ее. Если не увидел я - то извиняюсь.
1
|
229 / 76 / 9
Регистрация: 03.02.2013
Сообщений: 311
|
|
07.02.2013, 20:08 | 16 |
0
|
96 / 96 / 21
Регистрация: 25.04.2012
Сообщений: 449
|
|
07.02.2013, 20:08 [ТС] | 17 |
получается из такого указателя (тип А, а память выделена В) - нельзя вызвать методы класса В. Спрашивается - для каких целей нужен полиморфизм(я читал определение на вики, но не понятно все равно, не надо цитировать вики)
или для каких целей можно использовать этот "недоуказатель"? я так понимаю, смысл появляется когда весь класс и наследники переводятся на виртуальные функции, и только?
0
|
229 / 76 / 9
Регистрация: 03.02.2013
Сообщений: 311
|
|
07.02.2013, 20:10 | 18 |
Такой указатель нужен, когда вы используете функции, которые будут подходить для всех типов, которые наследуются от A. В этом весь сок полиморфизма.
1
|
96 / 96 / 21
Регистрация: 25.04.2012
Сообщений: 449
|
|
07.02.2013, 20:12 [ТС] | 19 |
кажется я не понимаю эту фразу, точнее "подходить для всех типов" - эта фраза приводит мои мысли к шаблонам, но ведь это не то. чего-то я не до понимаю
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
||||||
07.02.2013, 20:15 | 20 | |||||
у тебя есть класс фигура из него наследуется треугольник и квадрат и круг
ты создал массив фигур (разных) а теперь надо их все нарисовать если бы не было полиморфизма то пришлось бы проверять какая у тебя фигура и вызывать её метод рисования а так все просто
1
|
07.02.2013, 20:15 | |
07.02.2013, 20:15 | |
Помогаю со студенческими работами здесь
20
Значение delete в объявлении virtual функции Что изменяется, когда я у виртуальной функции в наследнике пишу virtual Зачем в конце объявления виртуальной функции ноль: virtual void show()=0 ? Виртуальные функции (нужно ли во всех производных классах писать слово virtual?) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |