**Наследование** - это механизм, который позволяет получить новый класс из уже существующего Назначение наследования: 1. Для повышения степени повторного использования кода 2. Для создания иерархии родственных классов 3. Для полиморфной обработки родственных объектов и автоматизации обработки данных #### Основные элементы методологии объектно-ориентированного проектирования, связанные с наследованием 1. Определение необходимой совокупности типов данных 2. Проектирование связей между типами и применение наследования для использования общего кода 3. Применение виртуальный компонентных функций для обработки объектов ![Иерархия классов при наследовании](11_01.%20Иерархия%20классов%20при%20наследовании.png) Наследование бывает: - открытым - защищенным - закрытым ```cpp class stud { public: stud(char* nm, int n, float r); void print() const; float summa(); protected: char name[50]; int N; float R; }; class asp : public stud { public: asp(char* nm, int n, float r, int t, char* th); void print() const; bool f_st(); protected: int st; char thesis[200]; }; class doct : public asp { public: doct(char* nm, int n, float r, int t, char* th, float g); void print() const; private: float grant; }; stud::stud(char* nm, int n, float r) : N(n), R(r) { strcpy(name, nm); } asp::asp(char* nm, int n, float r, int t, char* th) : stud(nm, n, r), st(t) { strcpy(thesis, th); } doct(char* nm, int n, float r, int t, char* th, float g) : asp(nm, n, r, t, th), grant(g) { } float stud::summa() { if (R >= 4.0) return ? ; return 0; } void stud::print() const { cout << name << N << R; } void print() const { cout << name << N << R; bool asp::f_st() { return (st > 5); } } void asp::print() { stud::print(); cout << st << thesis; } void doct::print() const { asp::print(); cout << print; } ``` | stud | asp | | ---- | ---- | | public: +++ | public: ++ | | protected: ### | protected: ## | | private: -- | private: -- | ![Иерархия классов stud, asp и doct](11_02.%20Иерархия%20классов%20stud,%20asp%20и%20doct.png) ```cpp stud s, *ps, &rs = s; asp a, *pa, &ra = a; doct d, *pd, &rd = d; s.print(); H = s.summa(); a.print(); t = a.f_st(); H = a.summa(); d.print(); t = d.f_st(); H = d.summa(); ps->print(); pa->print(); pd->print(); ps = pa = &a; ps->print(); ps = pd = &d; ps->print(); ``` ## Преимущества наследования 1. Код базового класса используется повторно 2. Иерархия родственных типов отражает взаимоотношения, свойственные предметной области 3. Полиморфная обработка родственных объектов - позволяет автоматизировать обработку информации в объектах производных классов