Скачиваний:
34
Добавлен:
28.03.2021
Размер:
229.36 Кб
Скачать

Министерство образования Республики Беларусь

Министерство образования Республики Беларусь

БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ

Кафедра эконмической информатики

Объектно-ориентированное программирование

Лабораторная работа №5

“ ПРИНЦИП ПОЛИМОРФИЗМА, ВИРТУАЛЬНЫЕ ФУНКЦИИ, АБСТРАКТНЫЕ КЛАССЫ ”

Вариант 7

Выполнила: Студентка группы

972303

Рушева Маргарита

Владиславовна

Проверила: Григорьева Юлия

Юрьевна

Минск, 2020

1 Цель лабораторной работы

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

2 Теория по лабораторной работе

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

УКАЗАТЕЛИ НА ПРОИЗВОДНЫЕ ТИПЫ

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

B_class *р; // указатель на объект типа

B_class B_class B_ob; // объект типа B_class

D_class D_ob; // объект типа D_class

Следующие инструкции абсолютно корректны:

р = &В_ob;// р указывает на объект типа B_class

р = &D_ob;/*р указывает на объект типа D_class, который является объектом, тип которого выведен из класса B_class*/

ССЫЛКИ НА ПРОИЗВОДНЫЕ ТИПЫ

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

ВИРТУАЛЬНЫЕ ФУНКЦИИ

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

Объявление: virtual void print(void);

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

Если виртуальная функция вызывается через указатель (или ссылку) на базовый класс, то C++ определяет, какую именно версию виртуальной функции необходимо вызвать, по типу объекта, адресуемого этим указателем. Это решение принимается во время выполнения программы. Следовательно, при указании на различные объекты будут вызываться и различные версии виртуальной функции.

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

НАСЛЕДОВАНИЕ ВИРТУАЛЬНЫХ ФУНКЦИЙ

Атрибут virtual передается "по наследству". Если функция была объявлена как виртуальная в некотором классе (базовом классе), то она остается виртуальной независимо от количества уровней в иерархии классов, через которые она прошла. При переопределении виртуальной функции в производном классе ключевое слово virtual повторять не нужно (хотя это не будет ошибкой). Класс, который включает виртуальную функцию, называется полиморфным классом. Этот термин также применяется к классу, который наследует базовый класс, содержащий виртуальную функцию. Если производный класс не переопределяет виртуальную функцию, то используется функция, определенная в базовом классе.

Основные правила использования виртуальных функций:

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

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

– виртуальные функции можно объявлять только в классах и структурах;

– виртуальными функциями могут быть только нестатические функции (без спецификатора static), т. к. характеристика virtual наследуется;

– виртуальные функции можно объявлять со спецификатором friend для другого класса;

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

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

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

Виртуальную функцию можно вызывать обычным способом, используя оператор "точка" и задавая имя вызывающего объекта. Однако при вызове виртуальной функции таким способом игнорируются ее полиморфные атрибуты. И только при обращении к виртуальной функции через указатель на базовый класс достигается динамический полиморфизм. Если виртуальная функция переопределяется в производном классе, ее называют переопределенной.

НЕОБХОДИМОСТЬ ПРИМЕНЕНИЯ ВИРТУАЛЬНЫХ ФУНКЦИЙ

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

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

АБСТРАКТНЫЕ КЛАССЫ

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

Чисто виртуальная функция — виртуальная функция, которая не имеет определения в базовом классе. Чисто виртуальная функция — функция, объявленная в базовом классе, но не имеющая в нем никакого определения. Поэтому любой производный тип должен определить собственную версию этой функции, ведь у него просто нет никакой возможности использовать версию из базового класса (по причине ее отсутствия). Объявив функцию чисто виртуальной, создаются условия, при которых производный класс вынужден иметь определение собственной ее реализации. Без этого компилятор выдаст сообщение об ошибке.

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

Соседние файлы в папке лабы салапура