Здавалка
Главная | Обратная связь

Чисто виртуальный деструктор.



Ну и, наконец, последняя порция информации о виртуальных функциях. Может так случиться, что в некоторых случаях будет очень удобно определить в классе чисто виртуальный деструктор.

Мы уже обсуждали сегодня чисто виртуальные функции. Они дают нам абстрактные классы, объект которых невозможно создать. Это основа для построения иерархии классов. Однако, иногда встречаются классы, которые имело бы смысл сделать абстрактными, но для этого в вашем распоряжении может не оказаться чисто виртуальных функций. Как быть? Решение не сложное. Объединим понятие чисто виртуальной функции и виртуального деструктора. Надо просто объявить в классе, который должен быть абстрактным, чисто виртуальный деструктор.

Приведем пример.

//абстрактный класс без виртуальных функцийclass Something { public: //а это чистый виртуальный деструктор virtual ~Something()=0; };

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

Something::~Something() {};

Это необходимо сделать, поскольку виртуальный деструктор работает таким образом, что вначале вызывается деструктор производного класса, а затем последовательно деструкторы классов, находящихся выше в цепи наследования, вплоть до базового абстрактного. Это означает, что компилятор будет генерировать вызов ~Something(), даже когда класс является абстрактным, поэтому тело функции надо определять обязательно. Если этого не сделать, компоновщик просто выдаст ошибку отсутствия символа. И сделать это все равно придется.

Несколько советов.

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

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

Примечание:Кстати! Конструкторы не могут быть виртуальными. Будьте бдительны!

Предыдущая Оглавление Следующая
Предыдущая Оглавление Следующая

Домашнее задание

Создать абстрактный базовый класс Employer (служащий) с чисто виртуальной функцией Print(). Создайте три производных класса: President, Manager, Worker. Переопределите функцию Print() для вывода информации, соответствующей каждому типу служащего.

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

Создать абстрактный базовый класс с виртуальной функцией - площадь. Создать производные классы: прямоугольник, круг, прямоугольный треугольник, трапеция со своими функциями площади. Для проверки определить массив ссылок на абстрактный класс, которым присваиваются адреса различных объектов. Площадь трапеции:S=(a+b)h/2

Создать класс живущих с местоположением. Определить наследуемые классы - лиса, кролик и трава. Лиса ест кролика. Кролик ест траву. Лиса может умереть - определен возраст. Кролик тоже может умереть. Кроме этого определен класс - отсутствие жизни. Если в окрестности имеется больше травы, чем кроликов, то трава остается, иначе трава съедена. Если лис слишком старый он может умереть. Если лис слишком много (больше 5 в окрестности), лисы больше не появляются. Если кроликов меньше лис, то лис ест кролика.

Создать абстрактный базовый класс с виртуальной функцией - корни уравнения. Создать производные классы: класс линейных уравнений и класс квадратных уравнений. Определить функцию вычисления корней уравнений.

Предыдущая Оглавление Следующая

 


 

Предыдущая Оглавление Следующая

Урок №33.

  • Введение в обработку исключительных ситуаций.
  • Реализация механизма. Ключевые слова try, catch, throw.
  • Пространства имен и их использование.
  • Экзаменационные задания.
  • Домашнее задание.
Предыдущая Оглавление Следующая
Предыдущая Оглавление Следующая






©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.