Виртуальные базовые классы. Состав класса. — КиберПедия 

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...

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

2019-11-19 442
Виртуальные базовые классы. Состав класса. 0.00 из 5.00 0 оценок
Заказать работу

Как известно, в С++ ключевое слово 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-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.008 с.