>Цели:
Изучить возможности виртуальных функций при наследовании классов на языке С++, абстрактные классы.
1. Краткие теоретические сведения
ВИРТУАЛЬНЫЕ ФУНКЦИИ
Виртуальные функции являются важной частью реализации механизма полиморфизма (то есть выполнения разных действий с объектами разного типа). Использование виртуальных функций позволяет выполнить нужные действия в том случае, если доступ к объекту осуществляется не по значению, а по указателю.
Пусть имеется класс «Фигура», и имеются его классы-наследники «Круг», «Квадрат» и «Треугольник». Пусть в каждом из этих классов есть функция draw( ), которая прорисовывает фигуры на экране.
Теперь пусть имеется указатель X на объект класса «Фигура». По правилам языка этот указатель может хранить адрес как самого класса «Фигура», так и адрес любого из его потомков, т.е. и «Круга» и «Квадрата» и «Треугольника». Теперь необходимо реализовать функцию draw( ) так, чтобы при обращении к ней через указатель X->draw( ) вызывалась бы именно нужная функция draw( ), то есть именно того класса, адрес которого и хранится в указателе X. Понятно, что у круга, квадрата и треугольника это будут разные функции. Чтобы обеспечить такую возможность для функции draw( ) её необходимо объявить виртуальной в базовом классе.
Ниже приводятся примеры, демонстрирующие возможности виртуальной функции.
Первый пример показывает, что бывает, когда базовый и производный классы содержат функции с одним и тем же именем, и к ним обращаются с помощью указателей, но без использования виртуальных функций.
2. Практическое задание (100%)
1. Определить иерархию классов (в соответствии с вариантом).
2. Определить в классе статическую компоненту — указатель на начало связанного списка объектов и статическую функцию для просмотра списка.
3. Реализовать классы.
4. Написать демонстрационную программу, в которой создаются объекты различных классов и помещаются в список, после чего список просматривается.
5. Сделать соответствующие методы не виртуальными и посмотреть, что будет.
6. Реализовать вариант, когда объект добавляется в список при создании, т.е. в конструкторе.
Методические указания
1. Для определения иерархии классов связать отношением наследования классы заданного варианта. Из перечисленных классов выбрать один, который будет стоять во главе иерархии. Это абстрактный класс.
2. Определить в классах все необходимые конструкторы и деструктор.
3. Поля класса специфицировать как protected.
4. Пример определения статических компонентов:
static person* begin; // указатель на начало списка
static void print(); // просмотр списка
5. Статическое поле инициализировать вне определения класса, в глобальной области.
6. Для добавления объекта в список предусмотреть метод класса, т.е. объект сам добавляет себя в список. Например, a.Add() объект a добавляет себя в список.
Включение объекта в список можно выполнять при создании объекта, т.е. поместить операторы включения в конструктор. В случае иерархии классов, включение объекта в список должен выполнять только конструктор базового класса. Вы должны продемонстрировать оба этих способа.
7. Список просматривать путем вызова виртуального метода Show каждого объекта.
8. Статический метод просмотра списка вызывать не через объект, а через класс.
Варианты заданий
1) студент, преподаватель, персона, завкафедрой;
2) служащий, персона, рабочий, инженер;
3) рабочий, кадры, инженер, администрация;
4) деталь, механизм, изделие, узел;
5) организация, страховая компания, судостроительная компания, завод;
6) журнал, книга, печатное издание, учебник;
7) тест, экзамен, выпускной экзамен, испытание;
8) место, область, город, мегаполис;
9) игрушка, продукт, товар, молочный продукт;
10) квитанция, накладная, документ, чек;
11) автомобиль, поезд, транспортное средство, экспресс;
12) двигатель, двигатель внутреннего сгорания, дизель, турбореактивный двигатель;
13) республика, монархия, королевство, государство;
14) млекопитающие, парнокопытные, птицы, животное;
15) корабль, пароход, парусник, корвет.
3. Список рекомендуемой литературы
1. Павловская Т. А.C/C++. Программирование на языке высокого уровня : для магистров и бакалавров : учеб. для вузов / Т. А. Павловская. — Гриф МО. — Санкт-Петербург: Питер, 2013. — 460 с. : ил.
2. Professional C++, 3rd Edition. Marc Gregoire. ISBN: 978-1-118-85805-9. Paperback 984 pages. September 2014
4. Контрольные вопросы
1. Какие возможности перед программистом открывают виртуальные функции?
2. Истинно ли утверждение о том, что указатель на базовый класс может ссылаться на объекты порожденного класса?
3. Пусть указатель p ссылается на объекты базового класса и содержит адрес объекта порожденного класса. Пусть в обоих этих классах имеется невиртуальный метод ding(). Тогда выражение p->ding() вызовет метод ding() из ……… класса.
4. Напишите описание для виртуальной функции dang(), возвращающей результат void и имеющей аргумент типа int.
5. Пусть указатель p ссылается на объекты базового класса и содержит адрес объекта порожденного класса. Пусть в обоих этих классах имеется виртуальный метод ding(). Тогда выражение p->ding() вызовет метод ding() из ……… класса.
6. Напишите описание для чистой виртуальной функции aragorn(), не возвращающей значений и не имеющей аргументов.
7. Чистая виртуальная функция, это виртуальная функция, которая:
а) делает свой класс абстрактным;
б) не возвращает результата;
в) используется в базовом классе;
г) не имеет аргументов.
8. Напишите определение массива parr, содержащего 10 указателей на объекты класса dong.
9. Абстрактный класс используется тогда, когда
а) не планируется создавать порожденные классы;
б) есть несколько связей между двумя порожденными классами
в) необходимо запретить создавать объекты класса
Прикрепленные файлы: |
|
|---|---|
|
Администрация сайта не рекомендует использовать бесплатные работы для сдачи преподавателю. Эти работы могут не пройти проверку на уникальность. Узнайте стоимость уникальной работы, заполните форму ниже: Узнать стоимость |
|
Скачать файлы: |
|
|
|
