Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Амир_СистПрог.docx
Скачиваний:
4
Добавлен:
01.07.2025
Размер:
90 Кб
Скачать
☆

Билет № 12

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

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

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

virtual <Тип><Имя_функции> (<Список параметров>) =0;

Здесь присваивание нулю – признак абстрактной виртуальной функции. При этом производный класс должен определить свою собственную версию функции, так как в базовом классе не существует версии, которую можно было бы использовать в производном.

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

Создание объектов абстрактного класса запрещено. Однако можно создавать указатели на объект абстрактного базового класса и ссылки того же типа и применять их для реализации механизма полиморфизма.

Пример иерархии с абстрактным классом

Класс TPole – общий базовый, его существование позволит нам объявить массив указателей на объекты этого класса. Сами объекты создавать не будем: в процессе работы в этот массив будут помещены указатели на объекты класса Число или на объекты класса Строка.

Для вывода на экран содержимого хранимых объектов в программе должен быть организован цикл, в котором для каждого объекта вызывается метод Print(). При этом вызов метода происходит через указатель на объекты базового класса. Если бы такой метод в базовом классе отсутсвовал, то для вызова этого метода объектами производных классов тип указателя пришлось бы явно переопределять. Это связано с тем, что указатель на объекты базового класса «не видит» полей и методов, появившихся в переопределенном классе. При наличии абстрактного метода Print() в базовом классе этой проблемы не возникает.

Естественно в базовом класса метод Print() объявляется виртуальным абстрактным, поскольку в объектах базового класса на экран выводить нечего.

Соответственно и класс Tpole получается абстрактным.

#include <locale.h>

#include <string.h>

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

class Tpole // абстрактный класс Поле

{

public: Tpole() {}

virtual void Print(void)=0; // абстрактная функция

};

class Tnumpole:public Tpole // класс Число

{

private: int num;

public:

Tnumpole(int n):num(n){}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]