Добавил:
Developer Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практикум по ПвСИБ. Программирование на языке C++.docx
Скачиваний:
15
Добавлен:
27.04.2022
Размер:
94.19 Кб
Скачать

Виртуальные функции

C++ поддерживает механизм переопределения функций. Для этого в базовом классе такие функции должны быть явно помечены ключевым словом virtual. Адреса таких функций помещаются в таблицу виртуальных функций класса, а в сам класс добавляется указатель на эту таблицу. Все вызовы виртуальных функций производятся через указатель. Конструктор производного класса берет на себя ответственность правильно указать адреса всех переопределённых функций. Определение того, какая реализация функции будет вызвана определяется в момент выполнения (динамическое или позднее связывание). Адреса функций, не являющихся виртуальными, известны во время компиляции (статическое или раннее связывание).

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

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

Пример

Определение базового класса

Определение производного класса

class BaseClass

{

public:

virtual void f() { }

virtual void g() = 0;

};

class DerrivedA : public BaseClass

{

public:

void f() override { }

void g() override { }

};

В данном примере функция f является виртуальной, а функция g чисто виртуальной. Обе функции переопределены в классе DerrivedA. Ключевое слово override появилось в стандарте С++11 и является опциональным. Ранее это ключевое слово не указывалось.

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

Задание

Для динамической структуры данных, разработанной в предыдущей лабораторной работе (стек, очередь или дек) создать абстрактный класс, выделив в него необходимые операции.

Стек

Очередь

Дек

Stack

Queue

Deque

int GetSize() const;

void Push(const T &element);

T Pop();

T Peek();

int GetSize();

void Push(const T &element);

T Pop();

T Peek();

int GetSize() const;

void PushFront(const T &element);

T PopFront();

void PushBack(const T &element);

T PopBack();

T PeekFront() const;

T PeekBack() const;

Унаследовать разработанный в предыдущей лабораторной работе класс от созданного в этой работе абстрактного класса.

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

Перегрузить операции присваивания, перемещения и потокового вывода для вывода содержимого динамической структуры на экран.

Класс разработать в варианте шаблона.

Создать функцию, получающую указатель на базовый класс и демонстрирующую работу

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