Prawdziwe oblicze Informatyki. Tysiące linijek kodu i kompilatory które nigdy nie wybaczają.
Awatar użytkownika

TheMediator95

Posty: 468
Rejestracja: 29 kwie 2010, 10:35
    Windows 8.1 Internet Explorer
Kontakt:

Post31 maja 2014, 19:30

Witam wszystkich zebranych! Nie przedłużając, przejdę do kodu:

Kod: Zaznacz cały

// DOSTĘP DO ZMIENNEJ "a" POPRZERZ DZIEDZICZENIE Z KLASY "A"
class A
{
      int a;
};

class B : public A
{
      int b;
};

Kod: Zaznacz cały

// DOSTĘP DO ZMIENNEJ "a" POPRZEZ WSKAŹNIK DO OBIEKTU TYPU "A"
class A
{
      int a;
};

class B
{
      A* _a;
      int b;

public:
B()
{
      _a = new A;
}

~B()
{
      delete _a;
}

};
Pytanie jest następujące, kiedy stosować dziedziczenie, a kiedy te rozwiązanie ze wskaźnikami?

Awatar użytkownika

PisarzKsiazkowicz

Moderator
Posty: 2149
Rejestracja: 27 sty 2010, 7:53
    Windows 8.1 Opera

Post31 maja 2014, 19:42

Dziedziczenie stosujesz, gdy chcesz zrobić nową klasę na bazie poprzedniej.
Wskaźniki stosujesz, gdy chcesz stworzyć obiekt klasy A wewnątrz obiektu klasy B.

Przykład, Lightbulb.
Stosuję dziedziczenie by zrobić klasę RosterListModel na bazie ListModel. W ten sposób mogę też zrobić inne takie bajery na bazie ListModel, w którym mam wspólne cechy dla wszystkich tych klas. W klasie MyXmppClient mam sobie wskaźnik do RosterListModel, dzięki czemu mogę sobie stworzyć i zarządzać listą kontaktów w tej klasie.

Z całym szacunkiem, ale takie przykłady omawiane na lekcjach są fallusowe.

Awatar użytkownika

TheMediator95

Posty: 468
Rejestracja: 29 kwie 2010, 10:35
    Windows 8.1 Internet Explorer
Kontakt:

Post31 maja 2014, 23:24

Czyli jak na razie nie powiedziałeś mi niczego czego bym jeszcze nie wiedział. Zobacz, na dobrą sprawę gdyby MyXmppClient dziedziczyłaby po RosterListModel to też "mogę sobie zarządzać listą kontaktów w tej klasie (RosterListModel )." Dlatego pytam się kiedy stosuje się jedno rozwiązanie, a kiedy drugie, które jest szybsze itd.
PisarzKsiazkowicz pisze:Z całym szacunkiem, ale takie przykłady omawiane na lekcjach są fallusowe.
Jakich lekcjach? :P

Awatar użytkownika

PisarzKsiazkowicz

Moderator
Posty: 2149
Rejestracja: 27 sty 2010, 7:53
    unknown Opera Mini

Post01 cze 2014, 9:20

A widzisz, bo nie. Co jeśli chciałbym mieć kilka modeli w tej klasie? Dziedziczenie powoduje, że mam wszystkie funkcje i obiekty danej klasy w nowej, gdy przy wskaźniku robisz nowy obiekt wewnątrz swojej klasy.

Nie ma jednoznacznej odpowiedzi lepsze/gorsze, tak jak z rodzajami pętli. Po prostu stosuje się to w różnych sytuacjach.

Awatar użytkownika

TheMediator95

Posty: 468
Rejestracja: 29 kwie 2010, 10:35
    Windows 8.1 Internet Explorer
Kontakt:

Post01 cze 2014, 17:17

PisarzKsiazkowicz pisze: Co jeśli chciałbym mieć kilka modeli w tej klasie?
W C++ klasa pochodna może mieć więcej niż jedną klasę bazową, tak więc bez problemu jeśli klasa MyXmppClient dziedziczyłaby po kolejnym "modelu", to efekt byłby taki sam jak przy użyciu wskaźnika. Więc jeśli chodzi o widoczność elementów składowych klas to nie ma znaczenia którego sposobu się użyje.
Wydaje mi się że jest to kwestia dobrej reprezentacji rzeczywistości w programach. Na przykład klasa Ubiór nie powinna być klasą bazową dla człowieka, ponieważ człowiek wcale nie musi być ubrany. W przypadku kiedy człowiek nie jest ubrany przy dziedziczeniu marnuje się pamięć zarezerwowaną dla ubioru którego nie ma. Tak samo z klasą Ubiór, może zawierać obiekty innych klas takich jak: Buty, Spodnie, Czapki itd., wydaje się lepszy w tej sytuacji wskaźnik bo nie mogę założyć że każdy będzie nosił na przykład czapkę.
Dziedziczenie zakłada iż coś na pewno istnieje, natomiast tworzenie wskaźnika na własny typ wewnątrz nowego typu, zakłada że coś może istnieć lub nie. Ja właśnie tak odbieram to rozwiązanie, chociaż mogę się mylić, dlatego tutaj napisałem. Tak więc Pisarzu, co o tym myślisz?
Wydaje mi się że metoda wskaźnikowa jest wolniejsza podczas tworzenia obiektu, natomiast szybsza podczas odczytu i zapisu danych na utworzonym obiekcie.

Awatar użytkownika

bsystem

Zasłużony użytkownik
Posty: 655
Rejestracja: 03 lis 2010, 16:44
    Windows 8.1 Chrome

Post01 cze 2014, 17:24

Mediator95 - człowiek, który prosi o radę a potem sam się wymądrza na temat w kwestii którego prosił.

Awatar użytkownika

lolasher

Zasłużony użytkownik
Posty: 2432
Rejestracja: 10 paź 2008, 19:28
Lokalizacja: Zadupie pod Siedlcami ;)
    Mac OS X Safari

Post01 cze 2014, 17:29

Mediator, a zasadnicza różnica nie polega na dziedziczeniu konstruktorów i takich tam?

Awatar użytkownika

PisarzKsiazkowicz

Moderator
Posty: 2149
Rejestracja: 27 sty 2010, 7:53
    Windows 8.1 Opera

Post01 cze 2014, 18:39

TheMediator95 pisze:W C++ klasa pochodna może mieć więcej niż jedną klasę bazową, tak więc bez problemu jeśli klasa MyXmppClient dziedziczyłaby po kolejnym "modelu", to efekt byłby taki sam jak przy użyciu wskaźnika. Więc jeśli chodzi o widoczność elementów składowych klas to nie ma znaczenia którego sposobu się użyje.
Lol nope.

Patrz.
Mam sobie klasę MyXmppClient, w której załóżmy, że jest RosterListModel i ChatsListModel.
Obie zawierają podobne funkcje i pododne dane, ale ChatsListModel zawiera dane dotyczące otwartych rozmów, zaś RosterListModel zawiera całą listę kontaktów. Jeśli użyłbym dziedziczenia, nie byłbym w stanie przechowywać obu osobnych list, you know?

Ale za to mogę zrobić na luzie wskaźnik roster i wskaźnik chats. :> Teraz mogę zrobić Q_PROPERTY, dzięki czemu będę mógł pobrać jedną listę po prostu w sposób xmppClient.roster i xmppClient.chats. Tego też nie mógłbym za bardzo zrobić korzystając z dziedziczenia.

bsystem() { this->approve(); }

lolasher, właśnie w tym rzecz. W momencie, gdy dziedziczysz, tworzysz klasę która opiera się na innej klasie, ma te same funkcje i wartości itd.

Jak już mówiłem, jeśli potrafisz kodzić, wiesz kiedy jedno ma sens, a kiedy drugie. To są dwie odrębne rzeczy i chociaż idealnie wpasowują się w Twój durny przykładzik, to w prawdziwym życiu nie ma tak łatwo.

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 6 gości