Шаг 11 - Абстрактные классы

Очень часто в базовом классе определяется виртуальная функция, которая не выполняет каких-либо значимых действий. Как я уже упоминал при объяснении понятия объекта, чем ниже находится класс в лестнице иерархии, тем он более конкретен. Т.е. базовый класс обычно не определяет законченный тип. Очень часто получается, что базовый класс не имеет какой-либо практической ценности для его непосредственного применения в программе. Однако он имеет ценность для формирования производных классов. Рассмотрим наш пример. Мы использовали в программе создание объекта класса vehicle только для придания примеру большей наглядности. В реальной же программе(также как и мире) нам вряд ли пригодится объект класса vehicle(транспортное средство). Нас больше интересует конкретная реализация возможностей этого класса, которую нам дают производные из него классы car, truck, boat. Рассматривая работу функции message класса vehicle, мы заметим, что при выполнении нашей программы только один раз (если не принимать в расчет первый вызов процедуры message, когда был определен объект класса vehicle) из трех вызывалась функция message класса vehicle. Если же в класс truck добавить свою функцию message, то реализация функции message в классе vehicle не будет представлять никакой ценности.

Таким образом, мы можем сделать два очень важных на данном этапе вывода:

  1. класс vehicle нам ценен только как базовый класс
  2. функция message класса vehicle стала нужна только для того, чтобы ее переопределили в производных классах.

Чисто виртуальным методом называют такой метод, который не определяется в базовом классе. У него нет тела, а есть только декларация о его существовании.

К примеру, если мы хотим представить класс vehicle в виде абстрактного класса, нам необходимо сделать две вещи: добавить метод message в класс truck и убрать тело функции в базовом классе vehicle. Тогда описание класса vehicle будет выглядеть следующим образом:

class vehicle 
{
int wheels;   
float weight; 
public: 
virtual void message(void) = 0;
};

Класс, содержащий хотя бы один чистый виртуальный метод, называется абстрактным классом.

Абстрактные классы не бывают изолированными, т.е. всегда абстрактный класс должен быть наследуемым. Поскольку у чисто виртуального метода нет тела, то создать объект абстрактного класса невозможно. Кроме того, во избежание появления ошибки при вызове чистого виртуального метода, производный класс должен содержать декларирование и тело чистого виртуального метода.

Абстрактным классом можно назвать класс, специально определенный для обеспечения наследования характеристик порожденными классами.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Valeri Khromov - 5.02.2000