Я напишу попроще, более подробное описание можно найти в "Шаг 6 - Полиморфизм", "Шаг 10 - Виртуальные (virtual) функции, раннее и позднее связывание". Итак, зачем нужны виртуальные функции? Использовать их очень удобно при многочисленном наследовании. МЫ можем подготовить некий класс, реализовав его функциональность. Но мы не знаем какие требования будут у разработчика в следующий раз. Используя виртуальные функции мы можем расширить наш класс для добавления новой функциональности. Смотрим простой пример класса, который что-то печатает. Например, колонтитулы:
#include "stdafx.h"
#include "iostream.h"
class Test1
{
public:
void print();
virtual void include(); // переопределяемая функция
};
void Test1::print()
{
cout << "Start Print" << endl;
include(); // в будующих реализация сюда включат код
cout << "Cansel Print " << endl;
}
void Test1::include() // в будующих реализация сюда включат код
{
cout << "Test1" << endl;
}
class Test2 : public Test1
{
public:
void include(); // переопределили
};
void Test2::include() // наша реализация
{
cout << "Test2" << endl;
}
void main()
{
Test2 t;
t.print();
}
Выполнение программы будет такое.
Start Print
Test2
Cansel Print
Press any key to continue
Совершенно тривиальная идея. Функция которую можно переопределить в новом классе. А если ее не переопределять? То вызовется функция предка.
............
class Test2 : public Test1
{
};
void main()
{
Test2 t;
t.print();
}
Результат будет такой.
Start Print
Test1
Cansel Print
Press any key to continue
То есть вызовется метод предка.