Контрольные вопросы для подготовки и самостоятельной работы
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), то она называется чистой виртуальной функцией. Чистая виртуальная функция не имеет определения в базовом классе, но определяется в производных. Класс, содержащий хотя бы одну такую функцию, называется абстрактным. Нельзя создать объект абстрактного класса.