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




 

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

1 Что означает оператор (::)?

2 Что означает понятие наследования?

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

4 Какой класс является наследником?

5 Сколько базовых классов может быть у производного класса?

6 Может производный класс быть базовым?

7 Можно ли задавать спецификаторы для базовых классов при наследовании (объявление произвольного класса)?

8 Как изменяется доступ к элементам базового класса при наследовании с различными спецификаторами доступа: из разделов класса, из программы, из других классов?

9 В чём разница между простым и множественным наследованием?

10 Что означает выражение «неполное объявление» класса?

11 Можно ли уточнить доступ к членам базового класса в производном классе? Как это осуществляется?

12 Какие функции называются друзьями класса?

13 Как объявляются и определяются функции–друзья класса?

14 Может ли класс быть дружественным?

15 Могут ли два класса быть друзьями друг другу?

16 Можно ли из класса-наследника получить доступ к private части базового класса, если спецификатор доступа при наследовании private?

 

Таблица 22.1 - Варианты понятий для базовых классов

Вариант Понятие Вариант Понятие
  Растения   Мебель
  Животные   Строения
  Небесные тела   Мосты
  Спортивные соревнования   Бритвы
  Печатная продукция   Принтеры
  Промышленное производство   Плоттеры
  Телефоны   Разъёмы электрические
  Железнодорожно-транспортные средства   Манипуляторы для ввода информации
  Автомобильный транспорт   Устройства записи информации
  Осветительные приборы   Сканеры
  Средства связи   ЭВМ
  Телевизоры   Нагревательные устройства
  Корабли   Устройства передачи крутящего момента
  Мебель мягкая    

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

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

(2 часа)

Цель работы: изучить и научиться использовать виртуальные функции в языке С.

Теоретические сведения

Виртуальные функции-члены объявляются в классе c ключевым словом virtual.

Если базовый класс (БК) base содержит виртуальную функцию (virtual) vf () и производный класс (ПК) derived также содержит эту функцию, то при вызове функции vf() для объекта базового класса мы получим base:: vf(), а для объекта производного класса мы получаем derived::vf(). Например:

Базовый класс Производный класс  
struct base {….. virtual void vf (void); void f (void); }; base_1 class {… public: virtual void vf(void)=0 void f(void); }; struct derived: public base {….. virtual void vf (void); // virtualв последнем // ПК можно опустить void f (void); };   derived d; //объект производ- // ного класса d.vf(); //вызов функции класса d // erived::vf() d.f(); //вызовфункции класса // derived::f() base* bp = &d; //указатель на // БК адресует объект ПК bp->vf (); //вызов виртуальной // функцииderived::vf() bp->f (); //вызов функции-члена // класса base // base:: f()

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

Поэтому при вызовах с помощью указателя bp на БК функций vf() и f() для объекта ПК с именем d вызываются, соответственно, derived::vf(), но base::vf(). В ызов нужной виртуальной функции vf() зависит от типа объекта, для которого она вызывается (derived d), в то время как вызов невиртуальной функции f() зависит только от типа указателя (base*bp), адресующего данный объект.

Если производный класс содержит функцию с тем же именем, что и имя виртуальной функции в базовом классе, то они должны иметь один и тот же тип. Функция vf() в ПК от БК, в котором содержится виртуальная функция vf(), также считается виртуальной. Виртуальная функция может быть определена в базовом классе. Виртуальную функцию, которая уже определена в базовом классе, в производном классе можно не определять. В этом случае при использовании указателя на БКдляадресацииПКпри всех обращениях используется функция, определенная в базовом классе. Если виртуальная функция в классе заканчивается нулём (=0), то она называется чистой виртуальной функцией. Чистая виртуальная функция не имеет определения в базовом классе, но определяется в производных. Класс, содержащий хотя бы одну такую функцию, называется абстрактным. Нельзя создать объект абстрактного класса.



Поделиться:




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

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


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