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