Шаг 104 - Виртуальные функции

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

То есть вызовется метод предка.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 15.07.2001