Виртуальные базовые классы




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

class B {... }; class D: B, B {... }: // недопустимо class X: public B {... }; class Y: public B {... }; class Z: public X, public Y {... }; // допустимо

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

 

class X: virtual public B {... }; // теперь В является виртуальным базовым

классом

class Y: virtual public B {... };

class Z: public X, public Y {... } // класс Z имеет только один подобъект класса В.

 

Виртуальные деструкторы

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

class color {... public: virtual ~color(); // виртуальный // деструктор для класса color }; class red: public color {... public: virtual~red(); // деструктор для red // также является виртуальным };

Class brightred: public red

{...

public:

virtual~brightred(); // деструктор для brightred также виртуальный

};

Рассмотрим работу с объектами объявленных классов. Указатель на базовый класс может адресовать объекты производных классов

Color *palette[3]; // объявление массива указателей на базовый класс

Palette[0] = new red; // создание объекта класса red в куче

palette[1] = new brightred; // создание объекта класса brightred в куче

palette[2] = new color; // создание объекта базового класса в куче

 

Применение оператора delete

 

delete palette[0]; // вызывается деструктор для объекта класса red

 

delete palette[1]; // деструктор для объекта класса brightred

delete palette[2]; // запуск деструктора для объекта класса color

Однако, если ни один из деструкторов не был объявлен виртуальным, то выражения delete palette[0 ], delete palette[1] и delete palette[2] вызывают только деструктор для базового класса color, на который объявлен массив указателей. Это приведет к неправильному уничтожению первых двух элементов, которые фактически имели тип red и brightred. Вызовы виртуальных деструкторов компонуются во время выполнения программы и объекты сами определяют, какой деструктор надо вызвать.

 

Ход работы

1 Изучить теоретические сведения.

2 В соответствии с индивидуальным заданием на базе лабораторной работы № 22 разработать алгоритм работы с объектами базового и производных классов с использованием указателей на базовые и производные классы. При необходимости довести иерархию классов до 3-4-х уровней.

3 Набрать программу на компьютере и устранить ошибки.

4 Получить результат.

5 Оформить отчет.

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

Требования к содержанию отчёта приведены в лабораторной работе №1.

Контрольные вопросы для подготовки и самостоятельной работы

1 Какие функции-члены называются встроенными (inline)?

2 Какие функции-члены называется перегруженными?

3 Какие функции-члены называются замещающими?

4 Какие функции- члены называется виртуальными?

5 Можно ли адресовать объекты ПК с помощью указателей на общий БК, на предыдущий БКпо иерархии?

6 Назовите правила использования указателей для работы с объектами БКи ПК.

7 Когда необходимо определение виртуальной функции в базовом классе?

8 Какой класс называется абстрактным?

9 Можно ли создать объект абстрактного класса?

10 Какая функция называется чисто виртуальной?

11 Можно ли установить в процессе компиляции какая функция будет вызываться при использовании указателей для работы с объектами?

12 Могут ли конструкторы и деструкторы быть виртуальными? Чем это вызвано?

13 Как производится размещение объектов классов в "куче"?

14 Как производится выделение и освобождение памяти для динамически создаваемых объектов?

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

16 Какая невиртуальная функция будет вызвана в указанном случае и почему?

17 Для чего или как объявляются виртуальные классы?

Литература

 

1 Керниган Б., Ритчи Д Язык программирования Си. – 2-изд. –М.: Финансы и статистика, 1992 – 272 с.

2 Страуструп Б. Язык программирования С++. –М.: Радио и связь.1991 – 352с.

3 Прокофьев Б.П., Сухарев Н.Н. и др. Графические средства Turbo C++. М.:ФИС. 19992 – 160 с.

4 Романовская Л.М., Русс Т.В., Святковский С.Г. Программирование в среде Си для ПЭВМ ЕС М.: ФИС, 1992 – 352с.

5 Берри Р., Микин Б. Языки Си. Введение для программирования. –1998 – 198с.

6 Шилдт Г. Язык "Си" для профессионалов. –М.: ИВК-СОФТ. 1992 – 319 с.

7 Ален И. Голуб. С и Си++. Правила программирования. / Под ред. В. Костенко. М: БИНОМ. 1996 – 272 с.

8 Бочков С.О., Субботин Д.М. Язык программирования Си для персонального компьютера. / Под ред. А.И.Садчикова – Диалог. Радио и связь, 1990 – 384с.

9 Болски М.И. Языки программирования Си: Справочник. Перевод с английского. Радио и связь, 1988 – 96с.

10 Лукас П. С++ под рукой: Справочник. _ К: ДиаСофт, 1993 – 176 с.

11 Проценко В.С., Чаленко И.П., Ставровский А.Б. Техніка програмування мовою Сі.- К: Либідь, 1993 – 224с.

12 Пол Ирэ. Объектно–ориентированное программирование с использованием С++. – К.: НИПФ "ДиаСофт Лтд." 1995. – 480с.

13 Гради Буч. Объектно–ориентированное проектирование. – К.: Диалектика. ИВК (Москва), 1992 – 519с.

14 Сван Т. Основание Borland C++ 4.5. Практический курс, в 2-х томах. 2 – изд.К.: Диалектика, 1996 – 544с.

15 Стивен Поттс, Т.С. Монк. Borland C++ в примерах. / Минск: Попури, 1996 – 752с.

 

Содержание

Стр.

1 Лабораторная работа № 1. Изучение интегрированной среды С....................4

2 Лабораторная работа №2. Функции ввода/вывода print(), scanf().
Линейные вычислительные процессы……….....................................…….…..6

3 Лабораторная работа № 3. Разработка программ со скалярными типами
данных…………………………………………………………………………..10

4 Лабораторная работа № 4. Разработка программ с циклическими
вычислительными процессами…………………………………..…………….15

5 Лабораторная работа №5. Разветвляющийся вычислительный процесс с различными логическими условиями: оператор if…else, условная операция(?:), оператор switch, оператор break, оператор goto……………………..19

6 Лабораторная работа №6. Операции С, их приоритеты и использование.
Преобразование типов…………………………………...........................…….23

7 Лабораторная работа №7. Изучение операций С. Разработка программ с функциями. Объявление, определение и вызов функций…………………...29

8 Лабораторная работа № 8. Разработка. программ с указателями.............…..34

9 Лабораторная работа № 9. Массивы. Селективная обработка массивов..….37

10 Лабораторная работа № 10. Формирование рабочих массивов с помощью операций селекции исходного массива.......................................................…..40

11 Лабораторная работа № 11. Обработка символьных данных.........…………41

12 Лабораторная работа № 12. Использование библиотечных функций для
работы с символьными данными.................................................................…..42

13 Лабораторная работа № 13. Вложенные циклы. Многомерные массивы. Массивы указателей.......................................................................…………….45

14 Лабораторная работа № 14. Разработка программ с составными типами
данных..…………………………………………………………………………47

15 Лабораторная работа № 15. Использование указателей для работы с
составными типами данных……………………………......……….…………50

16 Лабораторная работа № 16. Использование указателей для работы с
функциями………………………………………………………………………52

17.Лабораторная работа №17 Использованием функций высокого и низкого уровня для работы с потоками………………………………………………...54

18 Лабораторная работа № 18. Разработка программ с многофайловой струк-
турой. Заголовочные файлы. Классы памяти переменных и функций……..59

19 Лабораторная работа № 19. Изучение графических функций С……….…...62

20 Лабораторная работа № 20. Разработка программ с использованием
классов…………………………………………………………………………..65

21 Лабораторная работа № 21. Использование конструкторов и
деструкторов……………………………………………………………………72

22 Лабораторная работа № 22. Использование наследования для создания
иерархии классов………………………………………………………..……...77

23 Лабораторная работа № 23. Использование виртуальных функций и
указателей для работы с объектами классов.......................................…….…83

 

Выходные данные

Методические указания к лабораторным работам по дисциплине

«Языки объектно-ориентированного программирования»

(для студентов специальности 7.080402 “Информационные технологии проектирования” очной и заочной формы обучения )

Составители: А.Ф.Тарасов

А.В.Алтухов

Подписано в печать Формат 60х84 1/16

на 16 с. на 22 г.

Офсетная печать Усл.печ.л. Уч.- изд.л.

Тираж.

ДГМА. 84313, г.Краматорск, ул. Шкадинова, 72

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2022-09-06 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: