Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лек_ООП_1_2 Побудова об'єктної моделі предметно...doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
137.73 Кб
Скачать

Что понимается под наследованием в ооп?

Наследование — это механизм передачи свойств и методов родительского класса производным от него классам.

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

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

Один класс может наследовать другому. В C++ в таком случае говорят, что один класс является базовым, а другой (который наследует первому) — производным. Еще их называют соответственно классом-предком и классом-потомком. Наследование может быть прямым, когда один класс является непосредственным предком (потомком) другого, или косвенным, когда имеют место промежуточные наследования.

Производный класс наследует всю структуру характеристик и поведение базового, однако может дополнять или модифицировать их. Если класс В является производным по отношению к А, то с логической точки зрения “В есть А”. Например, понятие, или класс, “автомобиль” (В) является производным по отношению к понятию “средство передвижения” (А).

Как и в логике, здесь существует взаимосвязь между “содержанием” и “объемом” понятия. Производный класс имеет большее содержание, но меньший объем, чем базовый.

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

В чем проявляется полиморфизм классов?

Полиморфизм — это свойство объектов разных классов «выглядеть» одинаково, а вести себя, в соответствии со своими методами, по-разному.

Например, при вычислении расстояния между двумя точками нам все равно, это геометрические точки или материальные. Для программы расчета размеров изделия, и те и другие точки «выглядят» одинаково и, следовательно, могут передаваться в нее в качестве параметров.

Но, допустим, эта же программа рассчитывает и изменения размеров изделия при движении с ускорением. Для этого она просто попробует переместить все точки, послав им сообщения о размере, направлении и времени действия ускоряющей силы. Программа не знает, какие из полученных в качестве параметров точек являются материальными, а какие – геометрическими. Зато сами точки о себе это знают, и отреагируют на приложенную силу в соответствии со своей природой.

Кстати, полиморфизм может проявляться как для объекта в целом, так и для его отдельных функций. В классе для каждого вида перемещения может быть запрограммирован свой метод расчетов. Всем родственным методам можно дать одно имя, чтобы не пришлось запоминать много разных названий. Вызываемые функции будут различаться автоматически, в соответствии с параметрами переданного сообщения: если переданы смещения, то вызовется метод движения по прямой, а если центр и угол, то движение по дуге.

Полиморфизм, наряду с наследованием, является фундаментальной концепцией объектной модели программирования. Без него объектно-ориентированное программирование потеряло бы значительную долю своего смысла. Суть полиморфизма в том, что с объектами различных классов, имеющих один и тот же базовый класс, можно при определенных условиях обращаться, как с объектами базового класса; однако объект, являющийся, по видимости, объектом базового класса, будет вести себя по-разному в зависимости от того, что он такое на самом деле, т. е. представитель какого из производных классов.

В C++ полиморфное поведение объектов обеспечивается механизмом виртуальных функций-элементов. Допустим, программа должна в числе всего прочего выводить на экран различные геометрические фигуры. Она определяет класс “фигура”, в котором предусмотрен виртуальный метод “нарисовать” (в C++ это был бы абстрактный класс). От данного класса можно произвести несколько классов — “точка”, “линия”, “круг” и т. д., — каждый из которых будет по-своему определять этот метод.

Указатель на класс “фигура” может ссылаться на объект любого из производных классов (поскольку все они являются фигурами), и для указываемого им объекта можно вызвать метод “нарисовать”, не имея представления о том, что это за фигура на самом деле.