Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
15_наследование_14.doc
Скачиваний:
14
Добавлен:
10.04.2019
Размер:
612.35 Кб
Скачать

Лабораторная работа №15 Программирование с использованием наследования классов

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

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

Общий вид наследования:

class Base

{

// …..

};

class Derived: <ключ доступа> Base

{

// ……………

};

Ключ доступа может быть private, protected, public. Если ключ не указан, то по умолчанию он принимается private.

Наследование позволяет рассматривать целые иерархии классов и работать со всеми элементами одинаково, приводя их к базовому. Правила приведения следующие:

  • Наследуемый класс всегда можно привести к базовому;

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

Ошибки приведения базового класса к наследуемому отслеживаются программистом.

Доступ к элементам класса

При наследовании ключ доступа определяет уровень доступа к элементам базового класса внутри производного класса. В таблице 15.1 описаны возможные варианты доступа.

Таблица 15.1

Наследование

Доступ в базовом классе

Доступ в производном классе

public

public

protected

private

public

protected

private

protected

public

protected

private

protected

protected

private

private

public

protected

private

private

private

private

Конструкторы и деструкторы при наследовании

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

Пример 15.1.

#include <string.h>

class Base

{ public:

Base(int, float);

};

class Derived: Base

{ public:

Derived(char* lst, float amt);

};

Derived:: Derived(char* lst, float amt) : Base(strlen(lst),amt)

{ }

В деструкторе производного класса компилятор автоматически генерирует вызовы базовых деструкторов, поэтому для удаления объекта производного класса следует сделать деструктор в базовых классах виртуальным. Для вызова используется delete this либо operator delete.

Виртуальные функции

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

Для виртуальных функций существуют следующие правила:

  • виртуальную функцию нельзя объявлять как static.

  • спецификатор virtual необязателен при переопределении функции в производном классе.

  • виртуальная функция должна быть определена в базовом классе и может быть переопределена в производном.