logo
шпоры по ООП

25. Указатель на абстрактный класс.

Абстрактные классы

рассмотрим пример с вычислением площадей фигур. В этой программе использована виртуальная функция area(). Эта функция должна была быть первый раз определена в классе figure. Поскольку при нормальной работе не должно существовать объектов типа figure, а только объекты производных от него типов, то версия area () была определена так:

figure::area {return 0;}

Eсли бы тип возвращаемого значения у функции был void (например, при рисовании фигуры void show ( ), можно было бы написать:

void figure::show () {}

В обоих случаях эти функции фиктивны. Такого рода виртуальные функции можно было бы использовать для контроля ошибок, связанных с созданием объектов типа figure:

void figure::area () {

cout <<"Ошибка: попытка вычислить площадь ";

cout <<"несуществующего объекта!\n";

exit (1); return 1;

}

В С++ существует более удобный и надежный способ. Версия виртуальной функции, которая, с одной стороны, должна быть определена, а с другой, никогда не должна использоваться, может быть объявлена как чисто виртуальная функция:

class figure {. . .

virtual double area () = 0;

};

В классах, производных от figure, при наличии своей версии виртуальной функции area () она должна либо быть определена, либо, в свою очередь, объявлена как чисто виртуальная функция. Во время выполнения программы при обращении к чисто виртуальной функции выдается сообщение об ошибке и программа аварийно завершается. Класс, содержащий хотя бы одну чисто виртуальную функцию, называется абстрактным классом. Запрещено создание объектов таких классов. Это позволяет установить контроль со стороны компилятора за ошибочным созданием объектов фиктивных типов, таких как figurе. Заметим, что можно создавать указатели и ссылки на абстрактные классы.