# Наследяване ## Пример за наследяване При създаване на нов клас, който има общи компоненти и поведение с вече дефиниран клас, вместо да дефинира повторно тези компоненти и поведение, можем да го обявим за наследник на вече дефинирания. ```c++ class A { . . . public: void f() { . . . } . . . }; class B : public A { . . . } int main() { B obj; obj.f(); // OK! } ``` При наследяването: - Наследяват се член-данните и методите на основните класове - Получава се достъп до **някои** от наследените компоненти на основните класове В нашия пример класът **В е наследник на класа А.** Обекти от класовете изглеждат така: ![enter image description here](https://i.ibb.co/Fshm2LJ/Untitled-Diagram.png) След като В е наследник на класа А, то при създаване на обект от тип В се създава обект от тип А, **който е част от обекта** от тип В. ## Видове наследяване Някои типове наследяване в c++: - private (по подразбиране) - protected - public Примери: ```c++ class A { public: int x; protected: int y; private: int z; }; class B : public A { // x is public // y is protected // z is not accessible from B }; class C : protected A { // x is protected // y is protected // z is not accessible from C }; class D : private A // 'private' is default for classes { // x is private // y is private // z is not accessible from D }; ``` ## Подаване като параметри на функции. Класове-наследници могат да бъдат подавани като параметри на функции, които приемат обекти от базовия клас. Може да се използва функционалността само от базовия клас. ```c++ class A { int a; } class B : public A { public: int b; } void f(A& obj) { obj.a++; } int main() { A obj1; B obj2; f(obj1); //OK! f(obj2); //OK! } ``` ## Конструктури и деструктори при наследяване. Във всеки контструктор на класът-наследник, трябва да се оказва кой конструктор да се извика за базовия клас. Ако не оказано, ще се извика конструктора по подразбиране. ```c++ class B : public A { . . . public: B(...) : A(...) //some constructor of A. { . . . } } ``` Деструкторът на наследния клас извиква деструктора на базовия клас. ## Копиране при наследяване При разписване на конструктора за копиране и оператора за присовяване на клас-наследник, трябва експлицитно да извикваме копиране и за базовия клас. ```c++ B::B(const B& other) : A(other) // (copy constructor of A (base class) { copyFrom(other); } B& B::operator=(const B& other) { if (this != &other) { A::operator=(other); //operator= of A (base class) free(); copyFrom(other); } return *this; } ``` ## Задачи **Задача 1:** Реализирайте класове бар, от който ще могат да се взимат напитки (нормални и алкохолни) в определен ред. Редът ще бъде по зареждането им в бара. **Напитката** има *име и количество (в мл)*, а **алкохолната напитка** има *име, количество и процент алкохол.* Примерен интерфейс: ```c++ int main() { Bar b; b.addDrink("Coke", 330); b.addDrink("Fanta", 500); b.addAlocoholDrink("Zagorka", 500, 5); b.getAcloholDrink(); // Zagorka b.getDrink() // Coke b.getDrink() // Fanta } ```