**Наследование** - это механизм, который позволяет получить новый класс из уже существующего
Назначение наследования:
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. Полиморфная обработка родственных объектов - позволяет автоматизировать обработку информации в объектах производных классов