- •Билет № 3
- •Базовые конструкции структурного программирования
- •Процессы в Windows
- •Билет № 6
- •Объектно-ориентированное программирование
- •Простое наследование
- •Критические секции
- •Void InitializeCriticalSection(lpcritical_section lpCriticalSection); // вход в критическую секцию
- •Задача. Произвести инверсию (перестановка наоборот) массива
- •Билет № 9
- •События
- •Задача. Отсортировать массив методом выбора минимального элемента.
- •Билет № 12
- •Абстрактные классы
- •Void Print(void) /* аспект виртуальной функции*/
- •Void Print(void) /* аспект виртуальной функции*/
- •Исключения и их обработчики
- •Задача. Ввести с клавиатуры два вещественных числа и определить наибольшее из них.
- •Билет № 15
- •Назначение операционной системы
- •Резервирование, распределение и освобождение виртуальной памяти
- •Int *a; // указатель на массив целых чисел
- •Задача. Ввести целое число и определить, сколько в нем цифр.
Билет № 12
Абстрактные классы
Практика объектно-ориентированного программирования показывает, что иногда при разработке сложных иерархий классов целесообразно описывать классы, которые выражают некоторую общую концепцию, описывают основной интерфейс для использования в производных классах. Такой класс включает определение данных и методов, которые будут общими для различных производных классов, и составляет некоторую базу, от которой наследуются другие классы иерархии. Смыслового определения виртуальной функции в подобном базовом классе может не быть, но без ее объявления корректная реализация сложной иерархии затруднена. Такие функции в языке С++ описывают как абстрактные виртуальные.
Абстрактной виртуальной называется функция, объявленная в базовом классе как виртуальная, но не содержащая описания выполняемых действий. Для объявления абстрактной виртуальной функции используется следующая форма:
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){}
