Заочные электронные конференции
 
     
Особенности применения множественного наследования в С++
Степович-Цветкова Г.С.


Для чтения PDF необходима программа Adobe Reader
GET ADOBE READER

I Научная конференция студентов, аспирантов и молодых ученых «ПРОБЛЕМЫ МОДЕЛИРОВАНИЯ, ПРОЕКТИРОВАНИЯ И РАЗРАБОТКИ ПРОГРАММНЫХ СРЕДСТВ» - 2013

ОСОБЕННОСТИ ПРИМЕНЕНИЯ МНОЖЕСТВЕННОГО НАСЛЕДОВАНИЯ В С++

Г.С. Степович-Цветкова

Ивановский государственный университет

Язык программирования С++, являясь объектно-ориентированным, поддерживает возможность множественного наследования, когда класс является потомком сразу нескольких классов. С одной стороны, множественное наследование представляет собой мощный инструмент языка, позволяющий создавать комплексные типы данных, базирующиеся на различных свойствах объектов. Но с другой стороны, в процессе реализации такого варианта наследования могут возникнуть определенные трудности.

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

Вторая проблема, так называемая проблема ромба, – это случай многократного включения базового класса, поскольку базовые классы одного класса в свою очередь наследуют от одного и того же косвенного базового класса. При таком описании классов объект класса D будет содержать объект базового класса A дважды.

Причина многократного включения объекта базового класса заключается в представлении классов в С++. При наследовании базовые классы и классы-потомки помещаются в памяти непосредственно друг за другом. И поэтому объект производного класса представляет собой последовательность объектов родительских классов. Таким образом, объект класса D в памяти является следующей последовательностью объектов: (A, B, A, C, D). Двойное копирование объекта класса А приводит к неоднозначности и нерациональному использованию памяти компьютера, когда в действительности требуется присутствие объекта класса А лишь однажды.

Однако, возможны случаи, когда дублирование объекта базового класса оправдано. Например, в качестве класса А рассмотрим класс Пользователь, содержащий поля данных Логин и Пароль и предназначенный для создания учетных записей сотрудников некоторой организации. Потомки класса А: класс В – Сотрудник, имеющий доступ к базе данных организации; класс С – Сотрудник, имеющий доступ к почтовому серверу. Класс D наследует от классов В и С и является классом Сотрудник, имеющий доступ к базе данных и почтовому серверу. При этом одному и тому же сотруднику могут понадобиться различные идентифицирующие данные для получении доступа к базе данных и для доступа к почтовому серверу.

В случае если двойное копирование объекта косвенного базового класса все же не требуется, то существует механизм виртуального наследования, позволяющий в объект класса D поместить ровно одну копию объекта класса А. Для этого в нашем примере класс А необходимо объявить виртуальным базовым классом для классов B и C, тогда часть A объекта класса B будет совпадать с частью A объекта класса C. Механизм виртуального наследования функционирует путем добавления в классы B и C указателей на виртуальную таблицу vtable, и представление объекта класса D имеет следующий вид (vtable*, B, vtable*, C, D, A). Ценой отсутствия многозначности и единственности объекта А является увеличение размера объекта класса D на величину двух указателей.

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

Список литературы:

  1. Виртуальное наследование. URL: http://ru.wikipedia.org/wiki/Виртуальное_наследование (дата обращения: 10.06.2013г.).

  2. Труб И. О проблемах множественного наследования. URL: http://www.osp.ru/os/2001/02/179920/ (дата обращения: 10.06.2013г.).

Библиографическая ссылка

Степович-Цветкова Г.С. Особенности применения множественного наследования в С++ // I Научная конференция студентов, аспирантов и молодых ученых
«ПРОБЛЕМЫ МОДЕЛИРОВАНИЯ, ПРОЕКТИРОВАНИЯ И РАЗРАБОТКИ ПРОГРАММНЫХ СРЕДСТВ».
URL: http://econf.rae.ru/article/7720 (дата обращения: 19.04.2024).



Сертификат Получить сертификат