Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры_ООП.docx
Скачиваний:
5
Добавлен:
18.09.2019
Размер:
114.62 Кб
Скачать
  1. Множественное наследование

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

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

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

Если производный класс напрямую наследует несколько базовых классов, используется такое расширенное объявление:

class имя_проязводного_кла.сса: сп_доступа кмя_базового_класса1,

сп доступа лмя_баэовог^> класса.2,

. . . , сп доступа иия_базовосо-классам

{

// . . . тело класса

}

Когда наследуется несколько базовых классов, конструкторы выполняются слева направо в том порядке, который задан в объявлении производного класса. Деструкторы выполняются в обратном порядке.

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

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

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

Виртуальный базовый класс можно использовать для представления "головного" класса, который может конкретизироваться разными способами:

class window {

// головная информация

Virtual void draw();

};

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

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

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

­

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

Виртуальная функция является членом класса. Она объявляется внутри базового класса и переопределяется в производном классе. Для того, чтобы функция стала виртуальной, перед объявлением функции ставится ключевое слово virtual. Если класс, содержащий виртуальную функцию, наследуется, то в производном классе виртуальная функция переопределяется. По существу, виртуальная функция реализует идею "один интерфейс, множество методов", которая лежит в основе полиморфизма. Виртуальная функция внутри базового класса определяет вид интерфейса этой функции. Каждое переопределение виртуальной функции в производном классе определяет ее реализацию, связанную со спецификой производного класса. Таким образом, переопределение создает конкретный метод.

Виртуальная функция может вызываться так же, как и любая другая функция-член. Однако наиболее интересен вызов виртуальной функции через указатель, благодаря чему поддерживается динамический полиморфизм.

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

Свойства и правила использования виртуальных функций:

  • виртуальные функции можно объявить только в классах

(c1ass) и структурах (struct);

  • виртуальные функции не могут быть статическими (их нельзя объявить со спецификатором static);

  • виртуальными могут быть только компоненты-­функции (глобальные функции не могут быть виртуальными);

  • деструктор может быть виртуальным, а конструктор ­нет.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]