You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: module2/presentation.md
+67-40Lines changed: 67 additions & 40 deletions
Original file line number
Diff line number
Diff line change
@@ -706,7 +706,7 @@ ___
706
706
707
707
Co to za słowa? Co one robią? O tym w kolejnej lekcji ;)
708
708
709
-
Zostawiamy was z tym niedopowiedzeniem, abyście sami zechcieli poszukać o tym informacji lub przejrzeli wideo pana Zelenta.
709
+
Zostawiamy was z tym niedopowiedzeniem, abyście sami zechcieli poszukać o tym informacji lub przejrzeli wideo pana Zelenta. `virtual` tam znajdziecie, ale `override` nie, bo to zbyt nowa rzecz, bo weszła 9 lat temu ;)
710
710
711
711
___
712
712
@@ -736,17 +736,21 @@ int main() {
736
736
737
737
___
738
738
739
-
## Polimorfizm
739
+
## Nadpisywanie metod - `override`
740
740
741
-
Wracając do przykładu o ptakach, klasy `Penguin`, `Hummingbird` oraz `Goose` to klasy pochodne, które dziedziczą po pewnych klasach bazowych jak `Bird`, `Flyable`, `Soundable`, `Swimmable` oraz przeciążają kilka ich metod jak:
741
+
Wracając do przykładu o ptakach, klasy `Penguin`, `Hummingbird` oraz `Goose` to klasy pochodne, które dziedziczą po pewnych klasach bazowych jak `Bird`, `Flyable`, `Soundable`, `Swimmable` oraz nadpisują kilka ich metod jak:
742
742
743
743
*`void eat() override`
744
744
*`void sleep() override`
745
745
*`void makeSound() override`
746
746
*`void fly() override`
747
747
*`void swim() override`
748
-
749
-
Przeciążanie takich metod powoduje, że możemy zmienić nieco implementacje konkretnych metod:
748
+
749
+
Nadpisanie takich metod powoduje, że możemy zmienić ich implementacje
<!-- TODO: Pokazać, że bez słowa virtual też kod się skompiluje, ale zachowa się inaczej -->
849
864
850
-
Jak widzimy, nasz Doppler może przyjąć różne formy i zachowywać się tak jak one. Pomimo że wskaźnik jest typu Doppler.
851
-
Program dobrze wie, kiedy Doppler podszywa się pod człowieka, kiedy pod krasnoluda, a kiedy pod elfa.
865
+
Jak widzimy, nasz Doppler może przyjąć różne formy i zachowywać się tak jak one. Wskaźnik jest typu Doppler, ale program dobrze wie, kiedy Doppler podszywa się pod człowieka, kiedy pod krasnoluda, a kiedy pod elfa.
866
+
867
+
___
868
+
<!-- .slide: style="font-size: 0.9em" -->
869
+
870
+
## Wirtualne destruktory
852
871
853
872
Bardzo ważne w przypadku tworzenia metod wirtualnych i dziedziczenia jest tworzenie wirtualnych destruktorów.
854
-
Jeżeli korzystamy z dobroci polimorfizmu i nie oznaczymy destruktor jako `virtual` lub w klasach pochodnych jako `override`, to destruktor ten nie zostanie wywołany.
873
+
Jeżeli korzystamy z dobroci polimorfizmu i nie oznaczymy destruktor jako `virtual` to destruktor ten nie zostanie wywołany.
855
874
856
875
```cpp
857
876
#include <iostream>
@@ -870,10 +889,12 @@ public:
870
889
};
871
890
872
891
int main() {
873
-
Child child;
892
+
Child child; // ok, object on stack, not a pointer
Nawet jeżeli obiekt zajmowałby dużo miejsca w pamięci a my chcielibyśmy tylko jego nazwę i tak musimy go utworzyć, ponieważ tylko na nim możemy zawołać metodę `getName()`.
951
975
952
-
Rozwiązaniem tej uciążliwości jest `static`. Co więcej, problem ten możemy rozwiązać na 2 sposoby:
976
+
___
977
+
<!-- .slide: style="font-size: 0.9em" -->
978
+
979
+
## `static`
980
+
981
+
Rozwiązaniem tej uciążliwości jest `static`. Co więcej, problem ten możemy rozwiązać na 2 sposoby. Nie musimy w ten sposób tworzyć specjalnie obiektu, aby dostać się do cechy klasy, jaką jest jej nazwa.
953
982
954
983
```cpp
955
984
classObject {
@@ -972,8 +1001,6 @@ int main() {
972
1001
}
973
1002
```
974
1003
975
-
Nie musimy w ten sposób tworzyć specjalnie obiektu, aby dostać się do cechy klasy, jaką jest jej nazwa.
976
-
977
1004
<!-- TODO: Brakuje tu motywacji na jakimś konkretnym przykładzie -->
0 commit comments