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 на величину двух указателей.
Таким образом, работа с множественным наследованием требует особого внимания в случае возникновения конфликта имен полей данных или методов, а также в случае ромбовидного наследования.
Труб И. О проблемах множественного наследования. URL: http://www.osp.ru/os/2001/02/179920/ (дата обращения: 10.06.2013г.).
Библиографическая ссылка
Степович-Цветкова Г.С. Особенности применения множественного наследования в С++ // I Научная конференция студентов, аспирантов и молодых ученых «ПРОБЛЕМЫ МОДЕЛИРОВАНИЯ, ПРОЕКТИРОВАНИЯ И РАЗРАБОТКИ ПРОГРАММНЫХ СРЕДСТВ».
URL: http://econf.rae.ru/article/7720 (дата обращения: 02.04.2025).