Russian Qt Forum
Ноябрь 23, 2024, 08:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Виртуальные функции  (Прочитано 5960 раз)
developer
Гость
« : Октябрь 27, 2008, 14:27 »

Объясните, пожалуйста суть виртуальних функций в с++
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Октябрь 27, 2008, 17:14 »

Последством виртуальный функций реализуеться динамический полиморфизм. Литературы по этому поводу много:

Виртуальные функции. Что это такое? Часть 1
Виртуальные функции. Что это такое? Часть 2
Виртуальные функции. Что это такое? Часть 3
Виртуальный метод
для чего нужны виртуальные функции
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #2 : Октябрь 28, 2008, 01:24 »

Объясните, пожалуйста суть виртуальних функций в с++

Кратко так:

Представь, что есть класс с двумя методами А и Б. Метод А написан так, что при своей работе вызывает метод Б (ну для каких-то вспомогательных вычислений к примеру). Теперь мы наследуем этот класс, и в призводном классе переопределяем метод Б (то есть теперь Б реализует какие-то другие вычисления).

Вопрос - какая реализация метода Б будет вызываться в производном классе из метода А?

Ответ - будет вызываться реализация базового класса! Несмотря на то, что метод Б переопределен. И происходит это потому, что код реализации метода А в производном классе остается таким же, какой он существует и в основном классе. И этот код имеет команду вызова метода Б базового класса.

Пример. Следущий код

Код:
class base
{
 public:
  int x;

  base(void)
   {}

  int scale(int j)
   {
    return j*10;
   }

  void set_x(int i)
   {
    x=scale(i);
    printf("Set x to %d\n",x);
   }
};

class second : public base
{
 public:

  second(void)
   {}

  int scale(int i)
   {
    return i*10000;
   }
};

void main(void)
{
 base base_object;
 second second_object;

 base_object.set_x(5);
 second_object.set_x(5);
}

напечатает нам

Цитировать
Set x to 50
Set x to 50

А если мы перед методом scale() базового класса напишем слово virtual, то на экране мы увидим

Цитировать
Set x to 50
Set x to 50000

то есть получим то, что нужно.

Поэтому в C++ надо пользоваться таким правилом: если метод будет переопределяться в производном классе, то в базовом классе его надо писать с модификатором virtual.
Записан

Собираю информацию по крупицам
http://webhamster.ru
denka
Гость
« Ответ #3 : Октябрь 28, 2008, 08:25 »

Поэтому в C++ надо пользоваться таким правилом: если метод будет переопределяться в производном классе, то в базовом классе его надо писать с модификатором virtual.
Интерестно где ты такое вычитал Улыбающийся Как на счет того случая что мне всего лиш нужно дополнить функционал, переопределив метод базового класса, и я не собираюсь использовать динамический полиморфизм?
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #4 : Октябрь 28, 2008, 11:07 »

Поэтому в C++ надо пользоваться таким правилом: если метод будет переопределяться в производном классе, то в базовом классе его надо писать с модификатором virtual.
Интерестно где ты такое вычитал Улыбающийся Как на счет того случая что мне всего лиш нужно дополнить функционал, переопределив метод базового класса, и я не собираюсь использовать динамический полиморфизм?

Уточни тогда, как ты будешь вызывать переопределенный метод?

Да, и чем тебе помешал динамический полиморфизм? Неужели скорость вызова "не та"?
Записан

Собираю информацию по крупицам
http://webhamster.ru
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #5 : Октябрь 28, 2008, 12:46 »

"Уточни тогда, как ты будешь вызывать переопределенный метод?"
так и будет, по имени метода, это вообще нормальное явление, в родительском классе одноименный, но не виртуальный метод.
Записан

Юра.
developer
Гость
« Ответ #6 : Октябрь 28, 2008, 12:47 »

pastor спасибо за статьи, xintrea тебе спасибо за ясный и краткий ответ.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #7 : Октябрь 28, 2008, 15:29 »

Неужели скорость вызова "не та"?

Кстати скорость действительно будет "не та". Виртуальные методы медленее
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.057 секунд. Запросов: 23.