Я напишу попроще, более подробное описание можно найти в "Шаг 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
То есть вызовется метод предка.