Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab_cpp.doc
Скачиваний:
10
Добавлен:
07.06.2015
Размер:
2.81 Mб
Скачать

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

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

class B { ... };

class D : B, B { ... }:

// недопустимо

class X : public B { ... };

class Y : public B { ... };

class Z : public X, public Y { ... }; // допустимо

В данном случае каждый объект класса Z будет иметь два подобъекта класса В. Для устранения этой проблемы к спецификатору базового класса добавляют ключевое слово virtual. Например:

class X : virtual public B { ... }; // теперь В является виртуальным базовым

классом

class Y : virtual public B { ... };

class Z : public X, public Y { ... } // класс Z имеет только один подобъект класса В.

Виртуальные деструкторы

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

class color

{...

public:

virtual ~color(); // виртуальный

// деструктор для класса color

};

class red : public color

{...

public:

virtual~red(); // деструктор для red // также является виртуальным

};

class brightred : public red

{...

public:

virtual~brightred(); // деструктор для brightred также виртуальный

};

Рассмотрим работу с объектами объявленных классов. Указатель на базовый класс может адресовать объекты производных классов

Color *palette[3]; // объявление массива указателей на базовый класс

Palette[0] = new red; // создание объекта класса red в куче

palette[1] = new brightred; // создание объекта класса brightred в куче

palette[2] = new color; // создание объекта базового класса в куче

Применение оператора delete

delete palette[0]; // вызывается деструктор для объекта класса red

delete palette[1]; // деструктор для объекта класса brightred

delete palette[2]; // запуск деструктора для объекта класса color

Однако, если ни один из деструкторов не был объявлен виртуальным, то выражения delete palette[0], delete palette[1] и delete palette[2] вызывают только деструктор для базового класса color, на который объявлен массив указателей. Это приведет к неправильному уничтожению первых двух элементов, которые фактически имели тип red и brightred. Вызовы виртуальных деструкторов компонуются во время выполнения программы и объекты сами определяют, какой деструктор надо вызвать.

Ход работы

  1. Изучить теоретические сведения.

  2. В соответствии с индивидуальным заданием на базе лабораторной работы №22 разработать алгоритм работы с объектами базового и производных классов с использованием указателей на базовые и производные классы. При необходимости довести иерархию классов до 3-4-х уровней.

  3. Набрать программу на компьютере и устранить ошибки.

  4. Получить результат.

  5. Оформить отчет.

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

Требования к содержанию отчёта приведены в лабораторной работе №1.

Контрольные вопросы для подготовки и самостоятельной работы

  1. Какие функции-члены называются встроенными (inline)?

  2. Какие функции-члены называется перегруженными?

  3. Какие функции-члены называются замещающими?

  4. Какие функции- члены называется виртуальными?

  5. Можно ли адресовать объекты ПК с помощью указателей на общий БК, на предыдущий БК по иерархии?

  6. Назовите правила использования указателей для работы с объектами БК и ПК.

  7. Когда необходимо определение виртуальной функции в базовом классе?

  8. Какой класс называется абстрактным?

  9. Можно ли создать объект абстрактного класса?

  10. Какая функция называется чисто виртуальной?

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

  12. Могут ли конструкторы и деструкторы быть виртуальными? Чем это вызвано?

  13. Как производится размещение объектов классов в "куче"?

  14. Как производится выделение и освобождение памяти для динамически создаваемых объектов?

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

  16. Какая невиртуальная функция будет вызвана в указанном случае и почему?

  17. Для чего или как объявляются виртуальные классы?

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