Russian Qt Forum

Программирование => С/C++ => Тема начата: developer от Октябрь 27, 2008, 14:27



Название: Виртуальные функции
Отправлено: 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
{
 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.


Название: 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
Неужели скорость вызова "не та"?

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