[19] Dziedziczenie — podstawy
(Część C++ FAQ Lite, Copyright © 1991-2002, Marshall Cline, cline@parashift.com)


FAQ - sekcja [19]:


[19.1] Czy dziedziczenie jest ważne w C++?

Aha.

Dziedziczenie jest tym co oddziela zwykłe programowanie przy użyciu abstrakcyjnych typów danych (ADT) od programowania obiektowego (OO).

GóraDółPoprzednia sekcjaNastępna sekcjaSzukaj w FAQ ]


[19.2] W jakich sytuacjach używać dziedziczenia?

Kiedy chcemy używać pojęć ogólnych i wywiedzionych od nich pojęć szczegółowych.

Istoty ludzkie używają abstrakcji dwojakiego rodzaju: jest-częścią i jest-rodzajem. Ford Taurus jest-rodzajem samochodu i jednocześnie Ford Taurus ma silnik, opony, etc. (silnik jest-częścią Forda Taurusa). Hierarchia jest-częścią stanowi element inżynierii oprogramowania od momentu wprowadzenia stylu ADT; dziedziczenie dodaje "ten drugi" ważny wymiar abstrakcji.

GóraDółPoprzednia sekcjaNastępna sekcjaSzukaj w FAQ ]


[19.3] W jaki sposób wyrazić dziedziczenie w C++ ?

Używając słowa kluczowego : public:

 class Car : public Vehicle {
 public:
   
// ...
 }; 

Powyższy związek możemy opisać używając jednego z poniższych określeń:

(Uwaga: ten FAQ zajmuje się dziedziczeniem publicznym (public); prywatne i chronione rodzaje dziedziczenia mają inną specyfikę.)

GóraDółPoprzednia sekcjaNastępna sekcjaSzukaj w FAQ ]


[19.4] Czy mogę rzutować wskaźnik do klasy pochodnej na wskaźnik do klasy bazowej?

Tak.

Obiekt klasy pochodnej jest tego samego rodzaju co obiekt klasy bazowej. W związku z tym konwersja (rzutowanie) ze wskaźnika do klasy pochodnej na wskaźnik do klasy bazowej jest całkowicie bezpieczna i zdarza się często. Przykładowo, jeśli wskazuję na samochód to i wskazuję na pojazd, zatem rzutowanie Car* na Vehicle* jest całkowicie bezpieczne i zupełnie normalne:

 void f(Vehicle* v);
 void g(Car* c) { f(c); }  
// Zupełnie bezpieczne

(Uwaga: ten FAQ zajmuje się dziedziczeniem publicznym (public); prywatne i chronione rodzaje dziedziczenia mają inną specyfikę.)

GóraDółPoprzednia sekcjaNastępna sekcjaSzukaj w FAQ ]


[19.5] Jaka jest różnica między public, private a protected?

GóraDółPoprzednia sekcjaNastępna sekcjaSzukaj w FAQ ]


[19.6] Dlaczego moja klasa pochodna nie ma dostępu do prywatnych składników klasy bazowej?

Żeby ochronić Cię przed przyszłymi zmianami w części implementacyjnej klasy bazowej.

Klasy pochodne nie mają dostępu do prywatnych (private) składników klasy bazowej. To w efektywny sposób "odseparowuje" klasę pochodną od wszelkich zmian dokonanych w obrębie prywatnych części klasy bazowej.

GóraDółPoprzednia sekcjaNastępna sekcjaSzukaj w FAQ ]


[19.7] Jak mogę ochronić klasy pochodne przed zniszczeniem w wypadku gdy zmieniam wewnętrzne części klasy bazowej?

Klasa ma dwa różne interfejsy dla dwóch różnych grup klientów:

Jeżeli zakładasz, że również osoby spoza Twojego zespołu będą tworzyć klasy dziedziczące z Twojej klasy, wówczas powinieneś zadeklarować wszystkie pola swojej klasy jako private i używać chronionych (protected) funkcji dostępu zadeklarowanych jako inline, przy których pomocy klasy pochodne będą miały dostęp do prywatnych danych w klasie bazowej. W ten sposób prywatne pola mogą ulegać zmianie ale klasy pochodne nie ulegną zniszczeniu, chyba że zmienisz chronione funkcje dostępu.

GóraDółPoprzednia sekcjaNastępna sekcjaSzukaj w FAQ ]


E-Mail E-mail the author
C++ FAQ LiteSpis treściSkorowidzO autorze©Pobierz swoją własną kopię ]
Ostatnia aktualizacja Jun 17, 2002
Wersja polska: 0.1i Jul 12, 2004