Cóż nam po obiektach w dotychczasowej postaci? No nie dużo. Ale przecież możliwości obiektów się na tym nie kończą.
#include <iostream>
class Bazowa
{
protected:
int x;
int y;
public:
Bazowa(int x = 0, int y = 1) : x(x), y(y) {}
void Wyswietl() { std::cout << x << '\n' << y << std::endl; }
};
class Pochodna : public Bazowa
{
protected:
int z;
public:
Pochodna(int x = 0, int y = 1, int z = 2) : Bazowa(x, y), z(z) {}
void Wyswietl() { std::cout << x << '\n' << y << '\n' << z << std::endl; }
};
int main()
{
Bazowa b;
Pochodna p;
b.Wyswietl();
p.Wyswietl();
static_cast<Bazowa>(p).Wyswietl();
system("pause");
return 0;
}
Mamy klasę bazową i pochodną. Klasa pochodna dziedziczy po klasie bazowej przydzielając dostęp publiczny do publicznego interfejsu rodzica (można byłoby też np. wrzucić publiczny interfejs rodzica do private).
Używamy listy inicjalizacyjnej nie raz: można z jej pomocą nadawać wartości polom i wywoływać konstruktory.
"static_cast<Bazowa>(p).Wyswietl();" <- rzutowaliśmy obiekt pochodny na rodzica, przez co używaliśmy jego metody.
To była relacja jest czymś w rodzaju (is-like-a), ponieważ Pochodna dziedziczy po Bazowej.
Relacja ma coś to nic innego jak obiekt w obiekcie, więc nie muszę się rozpisywać :#