Читайте также:
|
|
Классы 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 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Множественное наследование | | | Замена множественного наследования наследованием от интерфейсов в других языках объектно-ориентированного программирования |