Лабораторная работа №6. Насле́дование — один из четырёх важнейших механизмов объектно-ориентированного программирования (наряду с инкапсуляцией

Тема: “Наследование”

Насле́дование — один из четырёх важнейших механизмов объектно-ориентированного программирования (наряду с инкапсуляцией, полиморфизмом и абстракцией), поз­во­ля­ющий описать новый класс на основе уже существующего (родительского), при этом свойства и функциональность родительского класса заимствуются новым классом.

Классы чаще всего строятся постепенно, начиная от базовых классов и заканчивая классами любой сложности. Каждый раз, когда из предыдущего класса производится последующий, то производный класс наследует какие-то или все родительские качест­ва, добавляя к ним новые.

Язык С++ отличается от других объектно-ориентированных языков еще и тем, что допускает не только простое наследование, но и множественное наследование, когда данный класс порождается сразу от нескольких родительских классов, наследуя по­ве­дение всех своих предков.

Имея хорошо разработанный базовый класс, нужно помнить и отлаживать только те изменения, которые были внесены в производные классы. Наследуя характеристики базового класса, можно заставить порожденный класс расширить, сузить, изменить, уничтожить или использовать эти характеристики без изменения.

Ø Простое наследование

Прежде чем строить производный класс, следует определить, можно ли в качестве базового класса использовать уже существующий класс? Часто уже имеются классы, которые имеют почти все нужные характеристики. Именно они и являются лучшими кандидатами в родители.

При создании экземпляра производного класса автоматически вызывается кон­ст­рук­­тор базового класса. После того как объект сконструирован, конструктор базового класса становится недоступным. Точно так же и деструкторы предназначены только для автоматического вызова при удалении объекта. Программе не разрешено явно вы­зывать деструктор.

Отношение дружественности не наследуется. Это как в реальной жизни: друзья Ва­ших родителей – не обязательно Ваши друзья. Любые отношения дружественности, объ­явленные в классах иерархического дерева наследования, не распространяются по дереву ни вверх, ни вниз.

Имя базового класса записывается после имени порожденного класса, отделяясь от него двоеточием.

Когда класс порождается от базового, все имена базового класса в производном классе автоматически становятся частными. Именно такое поведение в С++ по умолчанию. Но его легко изменить, указав следующие спецификаторы доступа для базового класса:

Ø private - (спецификатор по умолчанию, если иного при объявлении класса не указано). Все наследуемые имена базового класса с любой формой доступа становятся приватными в производном классе;

Ø public - все общедоступные имена базового класса будут общедоступными в производном классе, и все защищенные имена базового класса будут защищенными и в производном классе.

Ø protected – все общедоступные члены базового класса становятся защи­щен­ны­ми в производном классе. Защищенные и закрытые члены сохраняют свои перво­на­чаль­ные спецификации доступа в производном классе.

Учитывая, что в программировании на язык С++ особое внимание уделяется насле­дованию и повторному использованию, программист тратит много времени на разра­ботку классов, которые являются базовыми для других классов. Привилегий доступа private и public, которые были установлены для первых версий языка, оказалось явно недостаточно, и была введена еще одна привилегия – protected. Любой идентификатор, появившийся в секции protected базового класса, доступен функциям класса (но не поль­зователю). Эта привилегия распространяется вниз по иерархическому дереву не ограничено.

Базовый класс, производный класс или оба вместе могут иметь конструкторы и/или деструкторы. Если и у базового, и у производного класса имеются конструкторы и де­структоры, то конструкторы выполняются в порядке наследования, а деструк­торы – в обратном порядке.

При инициализации объектов производного класса часто возникает необходимость передать аргументы конструктору базового класса. В этом случае все необходимые аргументы базового и производного класса передаются конструктору производного класса, при этом базовому классу аргументы передаются через список инициализации данных.

Несмотря на тот факт, что объекты производных классов «являются» также и объектами базового класса, типы объектов производного и базового классов различны. Объекты производного класса можно рассматривать как объекты базового класса. В этом есть смысл, потому что производный класс имеет элементы, соответствующие каждому из элементов базового класса. Но производный класс обычно имеет большее количество элементов, чем его базовый класс. Поэтому присваивание объекта базового класса объекту производного класса оставило бы неопределенными добавочные элементы производного класса.

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

Класс может иметь много родителей, наследуя свойства каждого из них. Естественно, такой вид наследования сопряжен с определенным усложнением языка и компилятора, но и выгоды существенны.

Спецификатор доступа может быть разным для каждого базового класса, но его необходимо указывать для каждого имени. Когда наследуется множество базовых классов, конструкторы базовых классов выполняются слева направо в порядке, задаваемом в объявлении производного класса. Деструкторы выполняются в обратном порядке.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: