Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...
Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...
Топ:
Оснащения врачебно-сестринской бригады.
Особенности труда и отдыха в условиях низких температур: К работам при низких температурах на открытом воздухе и в не отапливаемых помещениях допускаются лица не моложе 18 лет, прошедшие...
Установка замедленного коксования: Чем выше температура и ниже давление, тем место разрыва углеродной цепи всё больше смещается к её концу и значительно возрастает...
Интересное:
Распространение рака на другие отдаленные от желудка органы: Характерных симптомов рака желудка не существует. Выраженные симптомы появляются, когда опухоль...
Мероприятия для защиты от морозного пучения грунтов: Инженерная защита от морозного (криогенного) пучения грунтов необходима для легких малоэтажных зданий и других сооружений...
Лечение прогрессирующих форм рака: Одним из наиболее важных достижений экспериментальной химиотерапии опухолей, начатой в 60-х и реализованной в 70-х годах, является...
Дисциплины:
|
из
5.00
|
Заказать работу |
Содержание книги
Поиск на нашем сайте
|
|
|
|
Как известно, в С++ ключевое слово virtual используется для объявления виртуальных функций, которые будут переопределены в производных классах. Однако ключевое слово virtual также имеет другое использование, позволяющее определить виртуальный базовый класс.
Обычные и виртуальные базовые классы отличаются друг от друга только тогда, когда какой-либо объект наследует базовый класс более одного раза. При использовании виртуального базового класса только одна копия базового класса содержится в объекте. В случае использования обычного базового класса в объекте могут содержаться несколько копий.
Поскольку класс может несколько раз выступать как косвенный базовый класс к производному классу, в C++ имеется способ оптимизировать функционирование таких базовых классов. Виртуальные базовые классы позволяют экономить пространство и исключать неоднозначности в иерархиях классов, в которых используется множественное наследование.
Каждый невиртуальный объект содержит копию элементов данных, определенных в базовом классе. Такой повтор данных приводит к ненужному увеличению их объема. Кроме того, при каждой попытке обращения к элементам базового класса приходится указывать, какая именно их копия требуется.
Если базовый класс определен как виртуальный базовый класс, то он может несколько раз выступать как косвенный базовый класс без дублирования элементов данных. Единственная копия его элементов данных совместно используется всеми базовыми классами, которые используют его как виртуальный базовый класс.
Когда создается объявление виртуального базового класса, в базовых списках производных классов указывается ключевое слово virtual.
Рассмотрим иерархию классов, представленную на следующем рисунке, на котором показана имитация графа Lunch-Line.
Смоделированный граф Lunch-Line

Как видно на рисунке, класс Queue является базовым для двух других классов: CashierQueue и LunchQueue. Однако когда эти два класса объединяются и образуют класс LunchCashierQueue, возникает следующая проблема: новый класс содержит два подчиненных объекта типаQueue — один из CashierQueue, а другой из LunchQueue. На следующем рисунке показана концептуальная структура памяти (фактическая структура памяти может быть оптимизирована).
Смоделированный объект Lunch-Line

Обратите внимание, что в объекте LunchCashierQueue имеется два подчиненных объекта Queue. В следующем коде содержится объявление Queue как виртуального базового класса:
class Queue {};
class CashierQueue: virtual public Queue {};
class LunchQueue: virtual public Queue {};
class LunchCashierQueue: public LunchQueue, public CashierQueue {};
Благодаря ключевому слову virtual будет включена только одна копия подчиненного объекта Queue (см. следующий рисунок).
Имитация объекта Lunch-Line с виртуальными базовыми классами

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

На этом рисунке показано, что классы CashierQueue и LunchQueue используют Queue как виртуальный базовый класс. Однако TakeoutQueueопределяет Queue в качестве базового класса, а не виртуального базового класса. Поэтому в LunchTakeoutCashierQueue имеется два подчиненных объекта типа Queue: один из пути наследования, включающего LunchCashierQueue, а второй из пути, включающегоTakeoutQueue. Это показано на следующем рисунке.
Структура объектов с наследованием от виртуальных и невиртуальных базовых классов

Наследование от виртуальных базовых классов позволяет существенно сократить объем данных по сравнению с наследованием от невиртуальных классов. Однако оно может породить дополнительные затраты на обработку.
|
|
|
История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...
Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...
Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...
Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...
© cyberpedia.su 2017-2025 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!