|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Проблема повторяющихся базовых классов
Классы TStringList и TTextReader в нашем примере могут иметь одинаковый базовый класс, например TObject. В этом случае объект класса TDelimitedReader имеет две копии полей класса TObject. Из-за дублирования полей возникает неоднозначность при обращении к полю класса TObject из метода класса TDelimitedReader. Проблема решается с помощью уточненного имени:
TTextReader::m_Field; TStringList::m_Field;
Однако главная проблема состоит в том, что одна сущность дублируется внутри базового класса. На практике это обычно не требуется.
Такой результат достигается при применении виртуальных базовых классов:
class TDelimitedReader: public TTextReader, public TStringList { ... }; class TTextReader: public TObject { ... };
class TStringList: virtual public TObject { ... };
Обычное наследование соответствует агрегации всех полей базового класса. Виртуальное наследование соответствует агрегации ссылки на поля базового класса.
Если же при объявлении класса TTextReader мы запишем следующее:
class TTextReader: virtual public TObject { ... }; то структура полей будет такой: Таким образом, множественное наследование таит следующую проблему: заранее неизвестно от каких классов программист захочет унаследовать свой класс. Однако при создании класса использовать виртуальное наследование неэффективно, если наследуются поля, так как доступ к полям всегда будет осуществляться через дополнительный указатель. Замена множественного наследования наследованием от интерфейсов в других языках объектно-ориентированного программирования Интерфейсы являются заменой множественному наследованию.
Вывод: одинарное наследование в стиле Java, C++, Delphi допустимо только от классов, множественное – от интерфейсов. Иначе можно осуществлять множественное наследование лишь от классов, в которых отсутствуют поля.
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.) |