Dziedziczenie

Transkrypt

Dziedziczenie
Metody i Języki Programowania w5, ćw.2
mgr inŜ. Paweł Kośla
Dziedziczenie
1. Dziedziczenie a kompozycja.
Dziedziczenie – umoŜliwia definiowanie i tworzenie specjalizowanych obiektów na
podstawie bardziej ogólnych.
Kompozycja(agregacja) – tworzenie nowej klasy uŜywając juŜ istniejących klas (jako
składowych nowej klasy).
Agregacja jest często przedstawiana w opozycji do dziedziczenia, które polega na
uszczegółowieniu typu ogólnego w celu utworzenia typu szczególnego. Agregacja nie tworzy
podtypu tylko nowy typ.
KOMPOZYCJA:
DZIEDZICZENIE
class KlasaA
{
metoda_A();
}
class KlasaA
{
metoda_A();
}
class KlasaB
{
KlasaA a;
metoda_B();
}
class KlasaB : public KlasaA
{
metoda_B();
}
main()
{
KlasaB ob;
ob.a.metoda_A();
ob.metoda_B();
}
main()
{
KlasaB ob;
ob.metoda_A();
ob.metoda_B();
}
2. Modyfikatory dostępu
private – atrybut lub metoda z takim modyfikatorem moŜe być wywoływana przez metody tej
klasy.
protected – moŜe być wywoływana przez metody tej klasy lub klas pochodnych.
public – przez „kogokolwiek”.
3. Rodzaje dziedziczeń
”class KlasaB : public KlasaA”
prywatne – wszystkie składowe klasy podstawowej stają się składnikami prywatnymi w
klasie pochodnej.
chronione – prywatne będą prywatnymi, a chronione i publiczne staną się chronionymi.
publiczne – dostęp będzie taki sam jak w klasie podstawowej.
Metody i Języki Programowania w5, ćw.2
mgr inŜ. Paweł Kośla
4. Nadpisywanie metod
Metody klasy podstawowej mogą być modyfikowane w klasie pochodnej.
class KlasaA
{ public:
void metoda_A() { cout<<”metoda klasy podstawowej”; }
}
class KlasaB : public KlasaA
{
void metoda_A() { cout << „nadpisana metoda”; }
}
5. Polimorfizm, rzutowanie w górę
rzutowanie w górę - oznacza konwersję typu pochodnego (klasy pochodnej) na typ bazowy
(klasę bazową).
polimorfizm - to wykazywanie przez metodę róŜnych form działania w zaleŜności od tego
jaki typ obiektu jest wskazywany przez wskaźnik lub referencję (pomijając typ wskaźnika
lub referencji).
metoda wirtualna (zadeklarowana przy uŜyciu słowa kluczowego virtual) - pozwala w
klasach pochodnych zastępować implementację metod dostarczonych przez klasę bazową.
Kompilator dba o to by metoda zastępująca była wywoływana zawsze gdy obiekt na którego
rzecz ma ona być wywołana naleŜy do klasy pochodnej, nawet wtedy gdy obiekt ten jest
wskazywany nie przez wskaźnik do klasy pochodnej a przez wskaźnik do klasy bazowej.
Pozwala to zastępować w klasach pochodnych algorytmy uŜyte w klasach bazowych innymi
algorytmami, nawet gdy uŜytkownik nie wie o tym, Ŝe wywołuje klasę pochodną.
class KlasaA
{
virtual metoda_A() { cout<<”metoda klasy podstawowej”; }
}
class KlasaB : public KlasaA
{
metoda_A() { cout<<”metoda z klasy pochodnej”; }
}
main()
{
KlasaA * wsk;
KlasaB obiekt;
wsk = &obiekt; //wskaźnik typu klasy A , ale wskazujący na
obiekt klasy B
wsk->metoda_A(); // „metoda z klasy pochodnej”
// gdyby nie było „virtual” metoda_A wywołana
// byłaby jako metoda klasy wskaźnika
}
Metody i Języki Programowania w5, ćw.2
1.
2.
3.
4.
5.
mgr inŜ. Paweł Kośla
Ćwiczenie:
Stwórz klasę „Baza” z metodą „metoda_A()” oraz klasę „Pochodna” z metodą „metoda_B()”.
Klasa pochodna (publicznie) dziedziczy po klasie bazowej.
Odwołaj się do metod za pomocą obiektu klasy pochodnej.
Dodaj trzy atrybuty (public, protected i private) do klasy bazowej np. zmienna_publiczna,
zmienna_chroniona, zmienna_prywatna.
Sprawdź moŜliwość dostępu do tych zmiennych z wnętrza metody klasy pochodnej, oraz z
funkcji main za pomocą obiektu klasy bazowej.
Sprawdź punkt 2 ale zastosuj dziedziczenie prywatne.
Stwórz w klasie pochodnej metodę „metoda_A()” (taki sam nagłówek jak w klasie bazowej)
ale zmodyfikuj ciało metody. Sprawdź działanie metody_A() na obiekcie klasy pochodnej.
Utwórz hierarchię klas:
Figura
double pole
char * nazwa
void wyswietl()
Kolo
double promien
void oblicz_pole()
Prostokat
double a
double b
void oblicz_pole()
Kwadrat
double bok
void oblicz_pole()
- Stwórz obiekty tych klas i sprawdź działanie metod.
- Zastanów się jak moŜna inaczej przedstawić tą hierarchię.
Dodaj metodę wirtualną w klasie bazowej (virtual void oblicz_pole()). Stwórz wskaźnik do
klasy Figura i przypisz mu nowy obiekt klasy pochodnej. Sprawdź działanie metody.
Następnie usuń słowo „virtual” i zaobserwuj zmiany.