diff options
1 files changed, 189 insertions, 0 deletions
| -rw-r--r-- | Sem. 12/README.md | 189 |
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!
+}
+ ```
+ При наследяването:
+ - Наследяват се член-данните и методите на основните класове
+ - Получава се достъп до **някои** от наследените компоненти на основните класове
+
+
+В нашия пример класът **В е наследник на класа А.** Обекти от класовете изглеждат така:
+
+
+След като В е наследник на класа А, то при създаване на обект от тип В, то се създава обект от тип А, **който е част от обекта** от тип В.
+
+
+## Видове наследяване
+Някои типове наследяване в 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
+}
+ ```
+
+
|
