При множественном наследовании производный класс создается от более чем одного базового класса. ![Пример иерархии классов со множественным наследованием](14_01.%20Пример%20иерархии%20классов%20со%20множественным%20наследованием.png) ![Иерархия классов транспортных средств](14_02.%20Иерархия%20классов%20транспортных%20средств.png) Компилятор организует наследование на основе ориентированного ациклического графа: ![Ациклический граф](14_03.%20Ациклический%20граф.png) ``` ТС::назем::ПК ТС::водн::ПК ТС::возд::ПК ``` ![Иерархия классов person и worker](14_04.%20Иерархия%20классов%20person%20и%20worker.png) ```cpp class person_i { public: virtual void print() = 0; }; class person { public: void print(); protected: char name[50]; }; class student : virtual public person { public: void print(); float S(); protected: int N; float R; }; class worker : virtual public person { public: void print(); float Z(); protected: int N_tab; int K; }; class student_worker : public student, public worker { public: void print(); private: int t; //учебный отпуск }; int main() { person a; student s; worker w; student_worker d; } ``` 1. В порядке объявления инициализируются базовые классы 2. Инициализируются элементы классов в списке инициализаторов 3. Выполняется тело конструктора Виртуальные базовые классы создаются до того, как будут созданы невиртуальные базовые классы. ![Иерархия классов со множественным наследованием](14_05.%20Иерархия%20классов%20со%20множественным%20наследованием.png) ## Реализация наследования **Закрытое наследование** имеет своей целью только повышение степени повторного использования кода ![Разные виды наследования](14_06.%20Разные%20виды%20наследования.png) Шаблоны классов и функций легче проектировать. Программа быстрее выполняется, если мы используем шаблоны. ```cpp class vector { //БК public: vector(); vector(void* d, int n); vector(const vector& m); void print() const; void input(void* d); void* find(void* d); protected: void* p; int k; }; class vector_str : private vector { public: vector_str(); void print() const { vector::print(); } void input(char* d) { vector::input(d); } char* find(char* d) { return static_cast(vector::find(d)); } }; ```