АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Множественное наследование

Читайте также:
  1. Exercises for Lesson 2. Possessions / Личные вещи. Лексика. Множественное число. Притяжательные прилагательные. Притяжательные местоимения.
  2. Exercises for Lesson 2. Possessions / Личные вещи. Лексика. Множественное число. Притяжательные прилагательные. Притяжательные местоимения.
  3. II. Наследование пережившего супруга
  4. III. Наследование казны. Особый порядок наследования
  5. Инкапсуляция и наследование: суть инкапсуляции, суть наследования, предок, потомок, иерархии классов.
  6. Множественное наследование: суть, необходимость, проблемы. Интерфейсы.
  7. Множественное число
  8. Множественное число имен существительных.
  9. Множественное число существительных
  10. Множественное число существительных
  11. Наследование по древнему цивильному праву.

 

У одного класса может быть несколько базовых классов:

 

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);

...

};

 


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.)