dziedziczenie vs deklaracja obiektu

0

Hej, mam pytanko odnośnie dziedziczenia.
Czy może mi ktoś wskazać różnicę między dziedziczeniem a zadeklarowaniem obiektu rodzica w danej klasie poza następującymi:

  1. nie mamy dostępu do bloku protected
  2. do obiektu odwołujemy się przez dodatkową ścieżkę (.nazwa_klasy)
  3. nie możemy korzystać z funkcji virtualnych

chodzi o porównanie następujących zapisów:

class klasa_bazowa{
//...
}
class klasa_dziedziczona: public klasa_bazowa{
//rozbudowujemy klasę bazową
}

class pseudo_dziedziczenie{
klasa_bazowa obiekt;
//tworzymy nową klasę korzystającą z obiektu klasy bazowej
}

int main(){
klasa_dziedziczona obiekt1;
pseudo_dziedziczenie obiekt2;
obiekt1.jakas_funkcja();
obiekt2.obiekt.jakas_funkcja();
}

Co jeszcze daje dziedziczenie?

0
  1. Przy dziedziczeniu dziedziczysz również większość przeciążonych operatorów.
0
  1. Polimorfizm - możesz przypisać do wskaźnika obiekt dziecka wnuka prawnuka praprawnuka.....
    Korzyści tutaj płyną przy zastosowaniu funkcji wirtualnych o których wspomniałeś
0

Umozliwia OCP w dosc prosty i logiczny sposob.

0

Nie należy jednak przeceniać dziedziczenia, czasami lepiej jest zadeklarować pole potrzebnego typu, niż po tym typie dziedziczyć…

0

@Azarien prawdę mówi. Przykład:
Wyobraźmy sobie lampę z kloszem (nieprzezroczystym) . Po zapaleniu wyraźnie świeci. Mówi się, że zapalamy/włączamy lampę, a nie mówimy włączam żarówkę w lampie. Jednakże lampa nie jest typem żarówki (relacja is-a). Posiada odmienne własności i zawiera żarówkę (relacja has-a). Mamy tutaj enkapsulację, bo lampa dostarcza prądu do żarówki i filtruje jej światło przez klosz. I obiekt zawierany może zostać wymieniony, no bo kto o zdrowych zmysłach wyrzuca lampę gdy się przepali żarówka :P

Według mnie tutaj nie ma co porównywać, bo to są relacje o nieco innym zastosowaniu. W przeciwieństwie jednak do życia codziennego w programowaniu powstają byty czysto abstrakcyjne i rozpoznanie prawidłowej relacji rzeczywiście może przyprawić o ból głowy.

0

Jeszcze istnieje coś takiego jak delagacja czyli relacja pomiędzy dziedziczeniem a kompozycją:

class klasa_bazowa{
public:
void fun1(void) {}
void fun2(void) {}
};
class pseudo_dziedziczenie{
klasa_bazowa obiekt;
//tworzymy nową klasę korzystającą z obiektu klasy bazowej
public:
void fun1(void) {obiekt.fun1();}
void fun2(void) {obiekt.fun2();}
};

Zauważ ,że dzięki temu możemy wybiórczo udostępniać metody danego obiektu i nie dziedziczy się całego "interfejsu obiektu klasy bazowej". Dlatego jest to też propozycja godna rozważenia przy projektowaniu programu,ale jak już mówił azarien że można przekombinować program używając niepotrzebnie dziedziczenia

1 użytkowników online, w tym zalogowanych: 0, gości: 1