Website Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commit1f40fd007f6c091ed7a21f1065767de40f9f9418 (patch)
Author
 Angel Dimitriev <angel_dimitriev@abv.bg>
2022-05-10 20:08:48 +0300
Committer
 GitHub <noreply@github.com>
2022-05-10 20:08:48 +0300
Files15cae76cd02abe3279ca5f2adac478f82e109627
Object-oriented_programming_FMI-1f40fd007f6c091ed7a21f1065767de40f9f9418.tar
Object-oriented_programming_FMI-1f40fd007f6c091ed7a21f1065767de40f9f9418.tar.gz
Object-oriented_programming_FMI-1f40fd007f6c091ed7a21f1065767de40f9f9418.zip
Parent6fa501e0921a824676f50372cbe3f99dddadf1ab (diff)
Create README.md
1 files changed, 159 insertions, 0 deletions
-rw-r--r--Sem. 11/README.md159
diff --git a/Sem. 11/README.md b/Sem. 11/README.md
new file mode 100644
index 0000000..5203a7c
--- /dev/null
+++ b/Sem. 11/README.md
@@ -0,0 +1,159 @@
+
+# Наследяване
+## Пример за наследяване
+
+При създаване на нов клас, който има общи компоненти и поведение с вече дефиниран клас, вместо да дефинира повторно тези компоненти и поведение, можем да го обявим за наследник на вече дефинирания.
+
+```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;
+}
+ ```