Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛЕКЦИИ Программирование и основы алгоритмизации...doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.5 Mб
Скачать

Правила наследования функций-элементов. Вызовы конструкторов и деструкторов в иерархии

Наследуются все функции-элементы, кроме указанных ниже.

1)Конструкторы не наследуются, поэтому производный класс должен иметь собственные конструкторы.

Порядок вызова конструкторов в иерархии следующий.

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

б)Если конструктор базового класса требует указания параметров (наш случай), он вызывается явным образом в конструкторе производного класса в списке инициализации.

в)В случае нескольких базовых классов (множественное наследование) их конструкторы вызываются в порядке объявления.

г)В иерархии, состоящей из нескольких уровней, конструкторы базовых классов вызываются, начиная с самого верхнего уровня. После этого выполняются конструкторы тех элементов производного класса, которые являются объектами (см. композицию классов) других классов, в порядке их объявления в классе, а затем исполняется конструктор производного класса.

2)Не наследуется операция присваивания.

3)Не наследуются деструкторы.

а)Если в производном классе нет деструктора, он формируется по умолчанию и вызывает деструкторы всех базовых классов.

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

в)Для иерархии классов, состоящей из нескольких уровней, деструкторы вызываются в порядке, строго обратном вызовам конструкторов: сначала вызывается деструктор производного класса, а затем уже – деструктор базового класса.

Виртуальные функции и полиморфизм

(виртуальный – возможный, полиморфизм – способность к модификациям)

В рассмотренном выше примере наследования вызов функции –элемента происходил в соответствии с типом указателя, а не с фактическим типом объекта, на который ссылался указатель. Указателю базового класса был присвоен адрес объекта производного класса.

Объясняется это тем, что ссылки на функции-элементы разрешаются во время компиляции и компоновки программы. Это называется ранним связыванием. Для вызова функции-элемента производного класса потребовалось явное преобразование типа указателя.

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

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

2)Указатели на различные объекты иерархии входят в связный список. С указателями списка требуется выполнять единообразные операции.

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

Пример обявления виртуальной функции:

virtual float getx() const;