При множественном наследовании производный класс создается от более чем одного базового класса.
![Пример иерархии классов со множественным наследованием](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<char*>(vector::find(d));
	}
};
```