Название: Виртуальные функции Отправлено: developer от Октябрь 27, 2008, 14:27 Объясните, пожалуйста суть виртуальних функций в с++
Название: Re: Виртуальные функции Отправлено: pastor от Октябрь 27, 2008, 17:14 Последством виртуальный функций реализуеться динамический полиморфизм. Литературы по этому поводу много:
Виртуальные функции. Что это такое? Часть 1 (http://club.shelek.ru/viewart.php?id=239) Виртуальные функции. Что это такое? Часть 2 (http://club.shelek.ru/viewart.php?id=240) Виртуальные функции. Что это такое? Часть 3 (http://club.shelek.ru/viewart.php?id=242) Виртуальный метод (http://ru.wikipedia.org/wiki/Виртуальный_метод) для чего нужны виртуальные функции (http://www.rsdn.ru/Forum/message/2184147.1.aspx) Название: Re: Виртуальные функции Отправлено: xintrea от Октябрь 28, 2008, 01:24 Объясните, пожалуйста суть виртуальних функций в с++ Кратко так: Представь, что есть класс с двумя методами А и Б. Метод А написан так, что при своей работе вызывает метод Б (ну для каких-то вспомогательных вычислений к примеру). Теперь мы наследуем этот класс, и в призводном классе переопределяем метод Б (то есть теперь Б реализует какие-то другие вычисления). Вопрос - какая реализация метода Б будет вызываться в производном классе из метода А? Ответ - будет вызываться реализация базового класса! Несмотря на то, что метод Б переопределен. И происходит это потому, что код реализации метода А в производном классе остается таким же, какой он существует и в основном классе. И этот код имеет команду вызова метода Б базового класса. Пример. Следущий код Код: class base напечатает нам Цитировать Set x to 50 Set x to 50 А если мы перед методом scale() базового класса напишем слово virtual, то на экране мы увидим Цитировать Set x to 50 Set x to 50000 то есть получим то, что нужно. Поэтому в C++ надо пользоваться таким правилом: если метод будет переопределяться в производном классе, то в базовом классе его надо писать с модификатором virtual. Название: Re: Виртуальные функции Отправлено: denka от Октябрь 28, 2008, 08:25 Поэтому в C++ надо пользоваться таким правилом: если метод будет переопределяться в производном классе, то в базовом классе его надо писать с модификатором virtual. Интерестно где ты такое вычитал :) Как на счет того случая что мне всего лиш нужно дополнить функционал, переопределив метод базового класса, и я не собираюсь использовать динамический полиморфизм?Название: Re: Виртуальные функции Отправлено: xintrea от Октябрь 28, 2008, 11:07 Поэтому в C++ надо пользоваться таким правилом: если метод будет переопределяться в производном классе, то в базовом классе его надо писать с модификатором virtual. Интерестно где ты такое вычитал :) Как на счет того случая что мне всего лиш нужно дополнить функционал, переопределив метод базового класса, и я не собираюсь использовать динамический полиморфизм?Уточни тогда, как ты будешь вызывать переопределенный метод? Да, и чем тебе помешал динамический полиморфизм? Неужели скорость вызова "не та"? Название: Re: Виртуальные функции Отправлено: lit-uriy от Октябрь 28, 2008, 12:46 "Уточни тогда, как ты будешь вызывать переопределенный метод?"
так и будет, по имени метода, это вообще нормальное явление, в родительском классе одноименный, но не виртуальный метод. Название: Re: Виртуальные функции Отправлено: developer от Октябрь 28, 2008, 12:47 pastor спасибо за статьи, xintrea тебе спасибо за ясный и краткий ответ.
Название: Re: Виртуальные функции Отправлено: pastor от Октябрь 28, 2008, 15:29 Неужели скорость вызова "не та"? Кстати скорость действительно будет "не та". Виртуальные методы медленее |