Czym się różni klasa w klasie od klasy pochodnej ?
Ostatnio zmodyfikowano 2024-12-27 16:23
tBane Temat założony przez niniejszego użytkownika |
Czym się różni klasa w klasie od klasy pochodnej ? » 2024-12-27 15:09:01 Witam. Czym się różni klasa w klasie od klasy pochodnej? class KlasaBazowa1 { public: class KlasaPochodna1 { public: float x; KlasaPochodna1(); }; };
class KlasaBazowa2 { public: KlasaBazowa2(); };
class KlasaPochodna2 : public KlasaBazowa2 { public: float x; KlasaPochodna2() : KlasaBazowa2() { } };
KlasaBazowa1::KlasaPochodna1 * klasa1 = new KlasaBazowa1::KlasaPochodna1(); KlasaPochodna2 * klasa2 = new KlasaPochodna2();
|
|
DejaVu |
» 2024-12-27 16:02:55 KlasaPochodna1 nie jest klasą pochodną. Jest po prostu zadeklarowana wewnątrz KlasaBazowa1 i nic więcej. Równie dobrze mógłbyś napisać: namespace KlasaBazowa1 { class KlasaPochodna1 { }; }
... i uzyskałbyś praktycznie ten sam efekt. |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-12-27 16:04:39 Ok. W takim razie. Co możesz mi powiedzieć o tych klasach? Kiedy je stosować? Witam. Czym się różni klasa w klasie od klasy pochodnej? class KlasaBazowa1 { public: class KlasaZagniezdzona1 { public: float x; KlasaPochodna1(); }; };
class KlasaBazowa2 { public: KlasaBazowa2(); };
class KlasaPochodna2 : public KlasaBazowa2 { public: float x; KlasaPochodna2() : KlasaBazowa2() { } };
KlasaBazowa1::KlasaZagniezdzona1 * klasa1 = new KlasaBazowa1::KlasaZagniezdzona1(); KlasaPochodna2 * klasa2 = new KlasaPochodna2();
|
|
DejaVu |
» 2024-12-27 16:13:50 Zagnieżdżanie jednej klasy w drugiej ma sens wtedy, gdy chcesz 'zgrupować' daną klasę logicznie, że sens jej istnienia jest logiczny w kontekście klasy nadrzędnej. Przykład: class Ustawienia { public: class JednoUstawienie { private: JednoUstawienie( const std::string & _value ) : m_value( _value ) { } public: std::string getText() const { return m_value; } private: std::string m_value; } const JednoUstawienie & dajUstawienie( const std::string & _key ) const { auto itFound = m_ustawienia.find( _key ); if( itFound == m_ustawienia.end() ) throw std::exception(); return itFound->second; } };
Wówczas: - konstruktor JednoUstawienie może być wywołany wewnątrz Ustawienia pomimo, że jest prywatny - nie da się utworzyć obiektu JednoUstawienie spoza klasy, bo konstruktor jest prywatny - logicznie kod jest 'spięty' w jednym nadrzędnym pliku Ustawienia.cpp /edit: Natomiast nawiązując do 'dziedziczenia' to przeczytaj sobie kurs, bo te dwa zagadnienia o które pytasz są całkowicie od siebie rozłączne. W skrócie: jeżeli masz klasę bazową, np. Obiekt, to każdy obiekt ma swoją pozycję na scenie X, Y, więc możesz mieć w klasie bazowej pola X oraz Y, w tym również metody do ustawiania i aktualizacji położenia obiektów. W klasie pochodnej możesz dziedziczyć po klasie bazowej Obiekt i stworzyć np. Budynek dziedziczący po Obiekt, który będzie miał dodatkowe pola (np. szybkość produkcji jednostek), ale budynek też jest Obiektem więc będzie miał też położenie, więc zamiast implementować 'jeszcze raz' metody do obsługi położenia i pola, to możesz po prostu wykonać dziedziczenie. Ponadto mając listę "obiektów" możesz wykonać iterację po wszystkich elementach typu "Obiekt" i np. wyświetlić je w jednej pętli, niezależnie od tego czy Obiekt jest Budynkiem, Terenem, Jednostką czy czymkolwiek innym. |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-12-27 16:23:01 Już rozumiem. :-)
Jest Building i ten budynek dziedziczy po Object (pozycja, kształt). Ale Door i Window są częściami budynku więc są zagnieżdżone w Building
|
|
« 1 » |