From 19bb81ed57f662120906b5e57eeaadfdb4392184 Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Fri, 14 May 2021 10:26:23 -0400 Subject: Update README.md --- Sem. 12/README.md | 189 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 189 insertions(+) diff --git a/Sem. 12/README.md b/Sem. 12/README.md index e69de29..7acb429 100644 --- a/Sem. 12/README.md +++ b/Sem. 12/README.md @@ -0,0 +1,189 @@ + +# Наследяване +## Пример за наследяване + +При създаване на нов клас, който има общи компоненти и поведение с вече дефиниран клас, вместо да дефинира повторно тези компоненти и поведение, можем да го обявим за наследник на вече дефинирания. + +```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 +} + ``` + + -- cgit v1.3.1-23-gd82d