Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ГОС информатика2.docx
Скачиваний:
16
Добавлен:
07.07.2019
Размер:
130.5 Кб
Скачать
  1. Наследование. Управление доступом к базовому классу. Конструкторы, деструкторы и наследование. Виртуальные функции и полиморфизм.

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

Механизм наследования классов позволяет строить иерархии, в которых производные классы получают элементы родительских, или базовых, классов и могут дополнять их или изменять их свойства. При большом количестве никак не связанных классов управлять ими становится невозможным. Наследование позволяет справиться с этой проблемой путем упорядочивания и ранжирования классов, т. е. объединения общих для нескольких классов свойств в одном классе и исп-я его в качестве базового. Классы, находящиеся ближе к началу иерархии, объединяют в себе наиболее общие черты для всех нижележащих классов. По мере продвижения вниз по иерархии классы приобретают все больше конкретных черт. Множественное наследование позволяет одному классу обладать свойствами двух и более родительских классов. Множественное наследование означает, что класс имеет несколько базовых классов. Если в базовых классах есть одноименные элементы, при этом может произойти конфликт идентификаторов, который устраняется с п-ю операции доступа к области видимости. Способы доступа: Public(все открытые члены базового класса остаются открытыми и в производном, т.е. их можно вызвать в ф-ции main); Private(все открытые члены базового класса в производном классе становятся закрытыми, т.е. в main они не вызываются, но они остаются доступными для методов производного класса). Если способ доступа не указать, то базовый класс наследуется как закрытый(Private).

Если у базового и производного класса имеются конструкторы и деструкторы, то конструкторы выполняются в порядке наследования (вначале работает конструктор базового класса, а потом производного), а деструкторы работают в обратном порядке (сначала производного, а затем базового). Это так происходит потому, что базовый класс «не знает» о существовании производного, любая инициализация в нем выполняется независимо от производного класса и возможно будет основой для для инициализации, выполняемой в производном классе. Деструктор производного класса должен выполняться раньше деструктора базового класса, потому что базовый класс лежит в основе производного. Если бы деструктор базового класса выполнялся бы первым, то это разрушило бы и объект производного класса.

Виртуальная ф-ция должна быть членом класса. Она объявляется внутри базового класса и переопределяется внутри производного класса. Перед ее объявлением пишут слово virtual, в производных классах это слово не пишут. Напр, вирт ф-ция реализует идею “один интерфейс, множество методов”. Вирт ф-ция внутри базового класса опр-ет вид интерфейса этой ф-ции. Каждое переопр-е вирт ф-ции в производном классе опр-ет ее реализацию. Т.о. переопр-ние создает конкр метод. Вирт ф-ция может вызываться объектом, как любой другой метод класса, но наиб важен вызов вирт ф-ции через указатель на объект (именно так поддерживается динамический полиморфизм). Если указатель базового класса ссылается на объект производного класса, который содержит вирт ф-цию, то кампилятор опр-ет, какую версию вирт ф-ции вызывать. Опр-е конкр версии вирт ф-ции имеет место не в процессе компиляции, а в процессе выполнения программы. Именно тип объекта, на кот ссылается указатель и опр-ет ту версию вирт ф-ции, кот будет выполняться. Если два и более различных класса явл производными от базового класса, содержащего вирт ф-цию, то если указатель базового класса ссылается на разные объекты этих производных классов, выполняются различные версии вирт ф-ции. Этот процесс явл реализацией принципа динамического полиморфизма.