Язык С++ для системного программирования. Имена-этикетки. Класс как область действия, страница 15

занесли адрес, выделенный под объект класса student*/
 
p1→input();//Вызывается input()из класса student.
 
Studenty;
 
p1=&y;//Адрес объекта класса student занесен в р1.
 
p1→input();//Вновь вызов input()из класса student.
 
officer z;
 
man &w=z;
 
/* w - ссылка на базовый класс man, но инициализирована объектом z производного класса officer */
 
w.input();//Вызов input()из класса officer.
 
}

22.3.1 Полиморфизм и позднее связывание

Термины<полиморфизм> и <позднее(динамическое) связывание> обычно применяются, когда говорят о механизмах наследования и виртуальных функций языка С++.

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

22.4 Множественное наследование

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

Пример.

Class А
 
 {
 
 protected:
 
:
 
 public:
 
 :
 
 :
 
 };
 
Class В
 
{
 
 protected:
 
 :
 
 public:
 
 :
 
 :
 
 };
 
Class С: рublic А, рublic В
 
 
 
{ 
 
 };

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

При множественном наследовании производный класс может наследовать более одного экземпляра базового класса. В результате может возникнуть неоднозначность элементов. Чтобы производный класс наследовал только один экземпляр некоторого базового класса, нужно этот базовый класс объявить виртуальным. Для этого при спецификации производного класса перед именем базового класса нужно поставить ключевое слово virtual. Например, башня может состоять из конической и цилиндрической частей. У обоих есть такие общие элементы-данные, как объем, вес, полная поверхность. Эти общие элементы можно выделить в базовый класс class fiqure, от которого class conus и class cilindr являются производными. В свою очередь, class cilindr и class conus являются базовыми для класса class tower(башня). Имеет место множественное наследование. Чтобы производный class tower наследовал только один экземпляр базового класса fiqure, следует class fiqure объявить виртуальным при описании классов conus и cilindr.

class fiqure
 
[
 
protectrd:
 
:
 
:
 
};
 
 class conus:public virtual fiqure
 
 {
 
protectrd:
 
:
 
:
 
};
 
 class cilindr: public virtual fiqure
 
 {
 
protectrd:
 
:
 
:
 
};
 
 class tower: public conus, public cilindr
 
{
 
:
 
:
 
};

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

Следующий список показывает последовательность шагов при конструировании производного класса:

1.  Вызывается конструктор базового класса.

2.  Вызывается конструктор тех элементов, которые являются объектами какого-либо класса, в том порядке, в котором производный класс их объявляет.

3.  Исполняется тело конструктора производного класса.

Деструкция производного класса выполняется в порядке, обратном конструированию: