Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Проблема повторяющихся базовых классов

Понятие компонента | Понятие визуального программирования | Microsoft Visual Studio | Желательно встроить средства расширения в язык. | Всегда есть потеря на jmp; | Component Pascal | Предкомпилированные заголовки | Понятие пространства имен | Стандартные конструкторы | Порядок конструирования и разрушения объектов |


Читайте также:
  1. Problem1.проблема, задача; problem getting printer information from the system
  2. АӨК-нің басымды салаларының проблемаларын талдау
  3. А.С.Пушкин как литературный критик. Проблематика его литературно-критических статей и заметок; жанровое, стилевое своеобразие. Типологический анализ одной из работ.
  4. Азақстан Республикасының жағдайларына бар проблемаларды шешу бойынша бейімделуі мүмкін оң шетелдік тәжірибені шолу
  5. Анализ политического процесса в работах К.Маркса «Классовая борьба во Франции с 1848 по 1850 г.» и «Восемнадцатое брюмера Луи Бонапарта».
  6. Антропологія Аквіната як проблема душі і тіла.
  7. Архитектурные особенности организации ЭВМ различных классов.

 

Классы 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

{

...

};

то структура полей будет такой:

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


Дата добавления: 2015-11-16; просмотров: 56 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Множественное наследование| Замена множественного наследования наследованием от интерфейсов в других языках объектно-ориентированного программирования

mybiblioteka.su - 2015-2024 год. (0.006 сек.)