Абстрактные классы и чисто виртуальные функции



Когда мы говорим о классе как о типе, мы подразумеваем, что будут создаваться объекты этого типа. Однако во многих случаях бывает полезно определять классы, объекты которых программист и не собирается никогда создавать. Такие классы называются абстрактными классами. Поскольку в наследовании они играют роль базовых, мы будем называть их абстрактными базовыми классами. Никаких представителей абстрактного базового класса создать нельзя, поскольку, как мы скоро увидим, абстрактные классы являются неполными; «недостающие части» должны определяться производными классами.

Цель определения абстрактного класса состоит в том, чтобы предусмотреть обобщенный базовый класс, от которого будут производиться другие классы. Классы, которые могут использоваться для создания представителей, называются конкретными классами. Такие классы должны предусматривать реализации для всех определяемых ими элемент-функций. Мы могли бы определить абстрактный базовый класс TwoDimensionalShape и произвести от него такие конкретные классы, как Square, Circle и Triangle. Мы могли бы также создать абстрактный базовый класс ThreeDimensionalShape и произвести от него конкретные классы Cube, Sphere и Cylinder. Абстрактные базовые классы слишком общи, чтобы определять реальные объекты; нужно внести в них какую-то специфику, прежде чем мы сможем говорить о создании объектов. Например, если кто-то скажет вам «нарисуй двумерную фигуру», какую фигуру вы нарисуете? Конкретные классы делают именно это; они вносят в абстрактный класс специфику, благодаря которой имеет смысл создавать представители таких классов.

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

Хороший пример такой иерархии дает иерархия геометрических фигур

 

Класс будет абстрактным, если одна или несколько его виртуальных 

Функций объявлены «чистыми». Чисто виртуальная функция — это функция,

объявление которой завершается инициализатором = 0:

 

virtual float earnings() const =0; // чисто виртуальная функция

Инициализатор «= 0» называется чистым спецификатором. Для чисто виртуальных функций реализаций не предусматривается. Каждый конкретный производный класс должен заменять все чисто виртуальные функции базового класса их конкретными реализациями. Разница между виртуальными и чисто виртуальными функциями та, что виртуальная функция имеет реализацию и предоставляет производному классу возможность ее замены; в противоположность этому чистая виртуальная функции не предусматривает реализации и требует замены в производном классе (если производный класс должен быть конкретным; иначе производный класс также будет абстрактным).

 

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

Попытка создать представитель абстрактного класса вызывает ошибку компиляции.

Если не предусмотреть в производном классе замену чистой виртуальной функции, попытка создать объект этого класса приведет к ошибке компиляции.

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

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

 


Дата добавления: 2018-08-06; просмотров: 219; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!