Курс ООП в С презентация. ООП в с++(полный курс). Объекты и классы
Скачать 1.76 Mb.
|
НаследованиеНаследование – это такое отношение между классами, когда один класс частично или полностью повторяет структуру и поведение другого класса (одиночное наследование) или других (множественное наследование) классов. Наследование устанавливает между классами иерархию "общее-частное". Связи наследования также называют обобщениями (generalization) и изображают в виде больших белых стрелок от класса-потомка к классу-предку Рассмотрим учет сотрудников организации. Каждый сотрудник – это, прежде всего, человек. Студент, работник, руководитель – частные случаи объекта "человек", определяющего общие характеристики для всех своих разновидностей. Организация этих понятий в иерархию позволяет избежать повторения кода и обращаться с объектами производных классов как с объектами базового. Возьмем за основу иерархии класс person, немного изменив его структуру ради соответствия концепции наследования. Поскольку для всех объектов кадровой структуры требуется знать имя, фамилию, а также год рождения для определения возраста, объявим данные атрибуты как protected, заменив заодно тип представления имени и отчества на более удобный в работе тип string. Наследованиеclass person { public: void set_year(int value); const int get_year() const; void set_sirname(string& value); const string& get_sirname() const; void set_name(string& value); const string& get_name() const; protected: string name; string sirname; int year; }; Работник (employee) отличается от просто человека (person) тем, что работает в некотором подразделении (department) и получает определенную заработную плату. Руководитель (manager), являясь в свою очередь работником предприятия, отвечает за определенную группу подчиненных и может получать заработную плату, складывающуюся из основной ставки и надбавки в виде процента от заработной платы своих работников. НаследованиеВыделять новый класс из существующего стоит лишь тогда, когда он знает или делает то, чего не знает и не делает объект базового класса. Это означает присутствие в производном классе атрибута или метода, неприменимого для объектов класса-предка. Когда же требуется только выразить различие между объектами по категориям, достаточно сделать это просто по значению атрибута, выражающего место конкретного объекта среди прочих. В подобном случае наша диаграмма классов могла бы выглядеть так: Нам же требуется не просто отличать руководителя от просто работника, но и учитывать его связь с множеством подчиненных. Эта связь, в том числе, может использоваться для расчета заработной платы. НаследованиеОтношение наследования между классами вовсе не исключает различных видов отношений между их экземплярами. Так, мы вправе связать экземпляр класса manager с множеством объектов, описывающих подчиненных ему работников employee, а каждого из работников – с тем подразделением department, в котором тот работает. Разумно предположить, что и от подразделения можно будет перейти к списку связанных с ним лиц (по атрибуту persons). class employee : public person { public: virtual const double get_salary() const; void set_salary(double value); protected: double salary; department* Department; }; Связи между экземплярами классов реализуются посредством атрибутов, для которых также следует указывать область видимости в зависимости от того, кому они должны быть доступны. НаследованиеМеханизм наследования классов позволяет строить иерархии, в которых производные классы получают элементы родительских, или базовых, классов и могут дополнять их или изменять их свойства. Классы, находящиеся ближе к началу иерархии, объединяют в себе наиболее общие черты для всех нижележащих классов. По мере продвижения вниз по иерархии классы приобретают все больше конкретных черт: class manager : public employee { public: list virtual const double get_salary(); }; НаследованиеПравила наследования различных методов: Конструкторы не наследуются, поэтому производный класс должен иметь собственные конструкторы. Порядок вызова конструкторов:
Для иерархии, состоящей из нескольких уровней, конструкторы базовых классов вызываются, начиная с самого верхнего уровня. После этого выполняются конструкторы тех элементов класса, которые являются объектами, в порядке их объявления в классе, а затем исполняется конструктор класса. В случае нескольких базовых классов их конструкторы вызываются в порядке объявления. |