Объясните, пожалуйста суть виртуальних функций в с++
Кратко так:
Представь, что есть класс с двумя методами А и Б. Метод А написан так, что при своей работе вызывает метод Б (ну для каких-то вспомогательных вычислений к примеру). Теперь мы наследуем этот класс, и в призводном классе переопределяем метод Б (то есть теперь Б реализует какие-то другие вычисления).
Вопрос - какая реализация метода Б будет вызываться в производном классе из метода А?
Ответ - будет вызываться реализация базового класса! Несмотря на то, что метод Б переопределен. И происходит это потому, что код реализации метода А в производном классе остается таким же, какой он существует и в основном классе. И этот код имеет команду вызова метода Б базового класса.
Пример. Следущий код
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.