====== Dziedziczenie ======
* [[https://pl.wikibooks.org/wiki/C%2B%2B/Dziedziczenie|Dziedziczenie]] to mechanizm umożliwiający tworzenie nowych klas (klas pochodnych) na podstawie już istniejących klas (klas bazowych).
* Klasa pochodna dziedziczy wszystkie cechy klasy bazowej (pola i metody)
* może dodawać nowe cechy lub modyfikować istniejące
* hierarchia klas ułatwia organizację kodu i pozwala na ponowne wykorzystanie kodu
* Przesłanianie (//overriding//) metod w klasach pochodnych - umożliwia dostosowanie zachowania metod odziedziczonych z klasy bazowej do potrzeb klasy pochodnej
{{ zajecia:po:method_overriding_in_subclass.png?300 |}}
* Operatory widoczności w deklaracji dziedziczenia: ''private'', ''protected'', ''public'' określają, które elementy klasy bazowej są dostępne w klasie pochodnej i jak są dziedziczone: {{ zajecia:po:types_of_inheritance.png?400| }}
* ''public'' - wszystkie publiczne i chronione elementy klasy bazowej są dziedziczone jako publiczne i chronione w klasie pochodnej
* ''protected'' - wszystkie publiczne i chronione elementy klasy bazowej są dziedziczone jako chronione w klasie pochodnej
* ''private'' - wszystkie publiczne i chronione elementy klasy bazowej są dziedziczone jako prywatne w klasie pochodnej (domyślna wartość, gdy nie określono operatora widoczności)
* Inicjalizacja i destrukcja obiektów dziedziczonych - konstruktor klasy pochodnej może wywołać konstruktor klasy bazowej na liście inicjalizacyjnej, aby poprawnie zainicjalizować dziedziczone elementy. Destruktory są wywoływane w odwrotnej kolejności do konstruktorów, co zapewnia poprawne zwalnianie zasobów.
**Składnia**
class Bazowa
{
// definicja klasy
};
class Pochodna: public Bazowa
{
// definicja klasy
};
===== Ćwiczenie: Klasa pochodna Parabola =====
1. Utwórz klasę pochodną klasy ''Wielomian'' o nazwie ''Parabola''. Kod źródłowy klasy ''Wielomian'' znajdziesz w zakładce [[pliki|pliki]] lub w repozytorium [[https://github.com/IS-UMK/po_2026/tree/master/04_Wielomian_opeatory|GitHub]].
Parabola jest szczególnym rodzajem wielomianu, którego stopień wynosi 2.
$$ f(x) = ax^2 + bx + c $$
Dla paraboli możemy zdefiniować specyficzne operacje jak, np. wyznaczenie miejsc zerowych, wyznaczenie punktu ekstremalnego, itp.
* klasa ''Parabola'' będzie wymagała dostępu do prywatnych zasobów wielomianu, aby było to możliwe należy zmienić poziom dostępu dziedziczonych elementów z ''private'' do ''protected'' w klasie ''Wielomian''
* w klasie ''Parabola'' dodaj chronione pole ''delta'' zawierające wartość rzeczywistą równą $$ \Delta = b^2 - 4ac$$ \\ Wartość delty ustalana jest automatycznie w momencie zmiany współczynników $a, b, c$, m.in. w konstruktorze, podczas inicjowania obiektu.
2. Dla klasy ''Parabola'' zaimplementuj następujące operacje (dostępne publicznie):
* konstruktor inicjujący parabolę trzema wartościami $a$, $b$ i $c$, które definiują parabolę $$y=ax^2+bx+c$$ Ustaw wartości domyślne argumentów $a=0, b=0, c=0$.
* konstruktor kopiujący
* funkcję składową ''Ekstremum'', zwracającą położenie $x_e$ ekstremalnej wartości (minimum lub maksimum funkcji) $$x_e = -\frac{b}{2a}$$
* funkcję składową ''Pierwiastki'', zwracającą liczbę pierwiastków (miejsc zerowych) oraz ich wartości. Wartością zwracaną funkcji jest liczba miejsc zerowych: 0, 1 lub 2. Wartości miejsc zerowych (jeżeli istnieją) są zwracane przez adres lub referencję w argumentach funkcji.
$$x_1 = \frac{-b - \sqrt{\Delta}}{2a} \qquad x_2 = \frac{-b + \sqrt{\Delta}}{2a}$$
* funkcję składową ''ObliczWartosc'', która dla danej w argumencie wartości rzeczywistej ''x'' zwróci wartość wielomianu $f(x)$.
3. Napisz program, który wykorzysta klasę ''Parabola'' do wyznaczenia i wypisania wartości miejsc zerowych $x_1$ i $x_2$, wartość ekstremum $x_e$ oraz wartości funkcji w punktach $f(x_1)$, $f(x_2)$ oraz $f(x_e)$ dla dowolnej paraboli o współczynnikach $a$, $b$ i $c$ podanych przez użytkownika. Przetestuj działanie dla funkcji $f(x) = x^2 - 10^6x + 1$
**Diagram klas UML**
{{zajecia:po:wielomian_parabola.png?250}}
4. Zaimplementuj klasę pochodną, dziedziczącą po klasie ''Parabola'', która zastępuje implementację funkcji ''Pierwiastki'' i wyznacza miejsca zerowe [[wpp>Wzory_Viète’a|wzorami Viète’a]]:
* gdy $b < 0$ wyznacz pierwiastek $x_1$ korzystając z funkcji klasy bazowej (tradycyjny wzór) oraz $x_2$ z wzoru $x_2 = c/a/x_1$
* gdy $b \geq 0$ wyznacz pierwiastek $x_2$ korzystając z funkcji klasy bazowej (tradycyjny wzór) oraz $x_1$ z wzoru $x_1 = c/a/x_2$
5. Przetestuj działanie programu wyznaczającego miejsca zerowe funkcji kwadratowej wykorzystując klasę pochodną z punktu 4.
**Diagram klas UML**
{{zajecia:po:wielomian_parabola2.png?250}}
===== Zadanie 6: Klasa pochodna Linia =====
Utwórz klasę pochodną klasy ''Wielomian'' o nazwie ''Linia'' reprezentującą wielomian stopnia pierwszego (linię prostą) o postaci
$$y=ax+b$$
Zaimplementuj metody umożliwiające następujące operacje na obiektach klasy ''Linia'':
* konstruktor domyślny (inicjuje linię $y=0x+0$)
* konstruktor posiadający dwa argumenty, pozwalający zainicjować linię $y = ax+b$ wartościami $a$ i $b$
* konstruktor posiadający 3 argumenty $A$, $B$ i $C$ pozwalający zainicjować linię zdefiniowaną równaniem ogólnym
$$Ax + By = C \qquad \text{czyli} \qquad y = -\frac{A}{B}x + \frac{C}{B}$$
* konstruktor kopiujący
* funkcję składową ''PunktPrzeciecia(const Linia &l)'', która zwraca współrzędne przecięcia się z linią ''l'' daną w argumencie funkcji. Dwie linie $y=a_1x+b_1$ i $y=a_2x+b_2$ przecinaja się w punkcie $$x = -\frac{b_2-b_1}{a_2-a_1}$$
* w implementacji wykorzystaj pola dziedziczone z klasy ''Wielomian'' do przechowywania współczynników $a$ i $b$ linii prostej.
Napisz program, który wykorzysta klasę ''Linia'' oraz funkcję wyznaczającą punkt przecięcia linii prostych do rozwiązania układu równań postaci
$$
\left\{\begin{array}{l}
a_1 x + b_1 y = c_1 \\
a_2 x + b_2 y = c_2 \\
\end{array}\right.
$$
Dla wartości rzeczywistych $a_1, b_1, c_1, a_2, b_2, c_2$ podanych przez użytkownika program wypisuje wartość $x$ i $y$ stanowiące rozwiązanie powyższego układu równań. Możesz założyć, że układ równań zawsze posiada rozwiązanie, tj. obie linie proste nie są równoległe i posiadają jeden punkt przecięcia.
**Diagram klas UML**
{{zajecia:po:wielomian_linia.png?400}}
Przykład działania programu:
Podaj wspolczynniki a, b, c pierwszego rownania
2 8 4
Podaj wspolczynniki a, b, c drugiego rownania
1 1 2
Rozwiazaniem bedzie przeciecie linii prostych:
f(x) = -0.25 x +0.50
f(x) = -1.00 x +2.00
Rozwiazanie
x = 2
y = 0
Rozwiązanie w postaci plików nagłówkowych ''*.h'' i źródłowych ''*.cpp'' umieść w Moodle [[https://moodle.umk.pl/mod/assign/view.php?id=361024|Zadanie 6: Klasa Linia]]