Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Вопрос 1.15. Полиморфизм на примере иерархии классов геометрических фигур. Абстрактные классы. Виртуальный деструктор.




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

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

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

Виртуальная функция называется чистой, если в объявлении функции внутри объявления класса задан чистый спецификатор = 0.

class Shape { public: virtual void draw() = 0; ... };     // Чистая виртуальная функция  

Абстрактный класс нельзя употреблять в качестве типа объектов, типа параметров функций, типа возвращаемого функцией значения или как тип при явном приведении типа. Можно, однако, объявлять указатели и ссылки на абстрактный класс.

Shape s; Shape *s; Shape f(); void f(Shape s); Shape& f(Shape &s); // Ошибка: объект абстрактного класса // Всё правильно // Ошибка // Ошибка // Всё правильно

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






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных