Owad():waga(1),jadowitosc(false) {cout<<"konstruktor domyslny owada\n";}

Podobne dokumenty
class Samochod { void Ruch(); }; class Amfibia : public Samochod { void Ruch(); // amfibie pływają };

Dziedziczenie ze wspólnej klasy bazowej. Amfibia

string Rodzaj[4]= {"TV ", "wieza ", "DVD ", "kino "}; string Producent[4]={"Phillips", "Sony ", "Sanyo ", "Samsung "};

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Ssak::Ssak(Ssak& ref):waga(ref.ile_wazy()) {cout << "Konstruktor kopiujacy klasy Ssak...\n";} 1

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Programowanie 2. Język C++. Wykład 9.

Język C++ wykład VI. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VI. dr Jarosław Mederski.

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Plik klasy. h deklaracje klas

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

2.4 Dziedziczenie. 2.4 Dziedziczenie Przykłady programowania w C - kurs podstawowy

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Projektowanie klas c.d. Projektowanie klas przykład

dr inż. Jarosław Forenc

Programowanie obiektowe w C++ Wykład 12

Języki Programowania. Prowadząca: dr inż. Hanna Zbroszczyk. tel: Konsultacje: piątek:

Identyfikacje typu na etapie. wykonania (RTTI)

Laboratorium 2. Funkcje wirtualne

Wstęp do Programowania 2

Programowanie obiektowe język C++

Listy powiązane zorientowane obiektowo

Wstęp do Programowania 2

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Środowisko programistyczne GEANT4

ATD. Wykład 8. Programowanie (język C++) abstrakcyjny typ danych. Abstrakcyjne typy danych (ATD) Metody czysto wirtualne. Definicje i uwagi:

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 4. Karol Tarnowski A-1 p.

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

C++ - [4-7] Polimorfizm

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

#include "stdafx.h" #include <iostream> #include "windows.h" using namespace std;

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Problem Próby rozwiązania Maszyna stanów Inne zastosowania Podsumowanie. Maszyny stanów. Programowanie gier bez Unity, cz. 3.

Programowanie 2. Język C++. Wykład 3.

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Zaawansowane programowanie w języku C++ Programowanie obiektowe

TEMAT : KLASY POLIMORFIZM

Techniki Programowania wskaźniki

PARADYGMATY PROGRAMOWANIA Wykład 4

Opis zagadnieo 1-3. Iteracja, rekurencja i ich realizacja

Zaawansowane programowanie w C++ (PCP)

Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis.

Wykład V. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

Programowanie i struktury danych

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Zajęcia nr 5 Algorytmy i wskaźniki. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Laboratorium 3. Instrukcje wyboru

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

Mechanizm dziedziczenia

class Student Deklaracja klasy Osoba: Deklaracja klasy Student:

Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26

Programowanie obiektowe w języku C++ Zarządzanie procesami. dr inż. Jarosław Forenc. Przeładowanie (przeciążanie) operatorów

Programowanie Obiektowew języku C++ Zadania L9

Wprowadzenie do programowanie obiektowego w języku C++

Programowanie, część I

Podstawy programowania skrót z wykładów:

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Wstęp do programowania obiektowego, wykład 7

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 20 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 32

Wstęp do informatyki- wykład 12 Funkcje (przekazywanie parametrów przez wartość i zmienną)

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

Operatory na rzecz typu TString

Jzyk C++ cz 3. Jarosław Gramacki Instytut Informatyki i Elektroniki ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2" ( $%%) )'20 )*0) 1 / )

Programowanie w języku C++

ROZDZIAŁ 2. Operatory

Laboratorium 1 - Programowanie proceduralne i obiektowe

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Przeciążenie (przeładowanie nazw) funkcji

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 4. Karol Tarnowski A-1 p.

Wstęp do programowania

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

Polimorfizm w pigułce

Rzutowanie i konwersje

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Techniki Programowania wskaźniki 2

Programowanie obiektowe w języku

Dziedziczenie & W slajdach są materiały zapożyczone z

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Programowanie obiektowe

wykład V uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ - klasy

Podstawy Programowania Obiektowego

KLASY cz4. Dorota Pylak. destruktory składowe statyczne przeciążanie operatorów. wskaźniki

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Wstęp do Programowania 2

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Operacje wejścia/wyjścia (odsłona druga) - pliki

Programowanie w językach

Część 4 życie programu

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

Informatyka 2. Wykład nr 3 ( ) Politechnika Białostocka. - Wydział Elektryczny. dr inŝ. Jarosław Forenc

Język C++ Różnice między C a C++

Programowanie obiektowe w C++ Wykład 1

Technologie cyfrowe semestr letni 2018/2019

it = 0; memset((void *)ptr, 0, items*sizeof(double)); cout << "Konstruktor sparametryzowany " << title << " adres: " << ptr << "\n";

Transkrypt:

// Wskaźniki #include<iostream> using namespace std; class Owad int waga; bool jadowitosc; Owad():waga(1),jadowitosc(false) cout<<"konstruktor domyslny owada\n";} Owad (bool j):waga(2),jadowitosc(j) cout<<"konstruktor owada\n";} ~Owad() cout<<"destruktor owada\n";} void Ruch() cout<<"owad lata\n";} 1

class Komar : public Owad bool brudas; Komar(): Owad(true),brudas(false) cout<<"konstruktor komara\n";} void Aktywnosc() cout<<"brzeczy i gryzie\n";} ~Komar () cout<<"komar rozgnieciony na scianie\n";} class Mucha : public Owad bool brudas; Mucha(): brudas(true) cout<<"konstruktor muchy\n";} 2

void Aktywnosc() cout<<"lata i brzeczy\n";} ~Mucha () cout<<"mucha dostala w beret\n";} int main() Owad* owad=new Owad; cout<<"rozmiar obiektu : "; cout<<sizeof(owad); cout<<"\nowad :\n"; cout<<"waga - "<<owad->waga; cout<<"\njadowitosc - "<<owad->jadowitosc<<endl; owad->ruch(); delete owad; cout<<endl; Owad* mucha=new Mucha; cout<<"rozmiar obiektu : "; cout<<sizeof(mucha); cout<<"\nmucha :\n"; 3

cout<<"waga - "<<mucha->waga; cout<<"\njadowitosc - "<<mucha->jadowitosc<<endl; //cout<<"\nbrudas - "<<mucha->brudas; mucha->ruch(); //mucha->aktywnosc(); delete mucha; cout<<endl; Owad* komar=new Komar; cout<<"rozmiar obiektu : "; cout<<sizeof(komar); cout<<"\nkomar :\n"; cout<<"waga - "<<komar->waga; cout<<"\njadowitosc - "<<komar->jadowitosc<<endl; //cout<<"\nbrudas - "<<komar->brudas; komar->ruch(); //komar->aktywnosc(); delete komar; cout<<endl; 4

Mucha* mucha_1=new Mucha; /*pomimo delete mucha jest pamiętana jako wskaźnik do klasy Owad*/ cout<<"rozmiar obiektu : "; cout<<sizeof(mucha_1); cout<<"\nmucha :\n"; cout<<"waga - "<<mucha_1->waga; cout<<"\njadowitosc - "<<mucha_1->jadowitosc; cout<<"\nbrudas - "<<mucha_1->brudas<<endl; mucha_1->ruch(); mucha_1->aktywnosc(); delete mucha_1; cout<<endl; Komar* komar_1=new Komar; //j. w. cout<<"rozmiar obiektu : "; cout<<sizeof(komar_1); cout<<"\nkomar :\n"; cout<<"waga - "<<komar_1->waga; cout<<"\njadowitosc - "<<komar_1->jadowitosc; cout<<"\nbrudas - "<<komar_1->brudas<<endl; 5

komar_1->ruch(); komar_1->aktywnosc(); delete komar_1; cout<<endl; /* Mucha* mucha_2=new Owad; wymagane rzutowanie - o tym później */ } system("pause"); return 0; 6

Konstruktor domyslny owada Rozmiar obiektu : 4 Owad : waga - 1 jadowitosc - 0 Owad lata Destruktor owada Konstruktor domyslny owada Konstruktor muchy Rozmiar obiektu : 4 Mucha : waga - 1 jadowitosc - 0 Owad lata Destruktor owada Konstruktor owada Konstruktor komara Rozmiar obiektu : 4 Komar : waga - 2 7

jadowitosc - 1 Owad lata Destruktor owada Konstruktor domyslny owada Konstruktor muchy Rozmiar obiektu : 4 Mucha : waga - 1 jadowitosc - 0 brudas - 1 Owad lata Lata i brzeczy Mucha dostala w beret Destruktor owada 8

Konstruktor owada Konstruktor komara Rozmiar obiektu : 4 Komar : waga - 2 jadowitosc - 1 brudas - 0 Owad lata Brzeczy i gryzie Komar rozgnieciony na scianie Destruktor owada Press any key to continue... 9

// Rzutowanie #include<iostream> using namespace std; class Owad int waga; bool jadowitosc; Owad():waga(1),jadowitosc(false) cout<<"konstruktor domyslny owada\n";} ~Owad() cout<<"destruktor owada\n";} void Ruch() cout<<"owad lata\n";} 10

class Komar : public Owad bool brudas; Komar(): Owad(),brudas(false) cout<<"konstruktor komara\n";} void Aktywnosc() cout<<"brzeczy i gryzie\n";} ~Komar () cout<<"komar rozgnieciony na scianie\n";} int main() cout<<"static_cast\n\n"; Komar* komar=static_cast<komar*>(new Owad); cout<<"waga : "<<komar->waga<<endl; cout<<"jadowitosc : "<<komar->jadowitosc<<endl; 11

cout<<"brudas : "<<komar->brudas<<endl; komar->aktywnosc(); komar->ruch(); delete komar; //Komar* komar_1=dynamic_cast<komar*>(new Owad); cout<<"reinterpret_cast\n\n"; Komar* komar_1=reinterpret_cast<komar*>(new Owad); cout<<"waga : "<<komar_1->waga<<endl; cout<<"jadowitosc : "<<komar_1->jadowitosc<<endl; cout<<"brudas : "<<komar_1->brudas<<endl; komar_1->aktywnosc(); komar_1->ruch(); delete komar_1; } system("pause"); return 0; 12

static_cast Konstruktor domyslny owada waga : 1 jadowitosc : 0 brudas : 253 Brzeczy i gryzie Owad lata Komar rozgnieciony na scianie Destruktor owada reinterpret_cast Konstruktor domyslny owada waga : 1 jadowitosc : 0 brudas : 253 Brzeczy i gryzie Owad lata Komar rozgnieciony na scianie Destruktor owada Press any key to continue... 13

Przesłanianie funkcji klasy bazowej w klasie potomnej Zmiana implementacji funkcji klasy bazowej w klasie pochodnej zachodzi, gdy klasa pochodna tworzy funkcję o tym samym zwracanym typie, ale z inna implementacją funkcja klasy bazowej została przesłonięta (override) 14

// Przeslanianie funkcji klasy // bazowej w klasie potomnej #include<iostream> using std::cout; using std::endl; class Ssak void Glos() cout<<"glos ssaka\n";} class Kot : public Ssak void Glos() cout<<"miau!!\n";} 15

void main() Ssak zwierz; zwierz.glos(); Kot Mruczek; Mruczek.Glos(); Mruczek.Ssak::Glos(); system("pause"); } Glos ssaka Miau!! Glos ssaka Press any key to continue... 16

// Przeslanianie funkcji klasy // bazowej w klasie potomnej #include<iostream> using std::cout; using std::endl; class Ssak void Ruch(int m) cout<<"ssak przeszedl "<<m<<" krokow\n";} class Kot : public Ssak void Ruch() cout<<"kot przeszedl 10 krokow\n";} 17

void main() Ssak zwierz; zwierz.ruch(5); Kot Mruczek; Mruczek.Ruch(); //Mruczek.Ruch(6); Mruczek.Ssak::Ruch(8); system("pause"); } Ssak przeszedl 5 krokow Kot przeszedl 10 krokow Ssak przeszedl 8 krokow Press any key to continue... 18

//Działanie modyfikatora const #include <iostream> using namespace std; class Czolg void Armata() cout<<"armata"<<endl;} void Naped() cout<<"naped"<<endl;} void Zaloga()const cout<<"4-5"<<endl;} class T34 : public Czolg void Armata() cout<<"f-34"<<endl;} 19

void Naped() const cout<<"diesel"<<endl;} void Zaloga() cout<<"4"<<endl;} class Panther: public Czolg void Armata()const cout<<"kwk-43"<<endl;} void Naped() cout<<"benzyna"<<endl;} void Zaloga()const cout<<"5"<<endl;} void main() cout<<"tworzymy obiekty :\n"; T34 Rudy; cout<<"\nt - 34\n"; Rudy.Armata(); Rudy.Naped(); 20

Rudy.Zaloga(); Panther Nr_101; cout<<"\npanther\n"; Nr_101.Armata(); Nr_101.Naped(); Nr_101.Zaloga(); cout<<"\n Wskazniki do klasy czolg\n"; Czolg* czolgi[4]; cout<<"\nt - 34\n"; czolgi[0]=new T34; czolgi[0]->armata(); czolgi[0]->naped(); czolgi[0]->zaloga(); czolgi[1]=new Panther; cout<<"\npanther\n"; czolgi[1]->armata(); czolgi[1]->naped(); czolgi[1]->zaloga(); } system ("pause"); 21

Tworzymy obiekty : T - 34 F-34 diesel 4 Panther KwK-43 benzyna 5 Wskazniki do klasy czolg T - 34 armata naped 4-5 Panther armata naped 4-5 Press any key to continue... 22

Funkcje (metody) wirtualne Obiekt klasy Pies jest jednocześnie obiektem klasy Ssak. W C++ możliwe jest przypisywanie wskaźnikom do klas bazowych wskaźników do klas pochodnych, np. Ssak* pssak = new Pies; Na stercie tworzymy nowy obiekt klasy Pies, zaś otrzymany wskaźnik przypisujemy wskaźnikowi do obiektów klasy Ssak. Wskaźnik ten może zostać wykorzystany do wywołania dowolnej metody klasy Ssak 23

// Metody wirtualne #include<iostream> using namespace std; class Ssak void Ruch() cout<<"ssak chodzi\n";} void Sen() cout<<"ssak spi\n";} virtual void Glos()cout<<"Glos ssaka\n";} virtual void Glod() cout<<"ssak je\n";} class Pies : public Ssak void Glos()cout<<"Hau\n";} void Ruch()cout<<"Pies biega\n";} virtual void Sen() cout<<"pies spi\n";} virtual void Glod() cout<<"pies je\n";} 24

void main() Ssak *ppies = new Pies; ppies->glod(); ppies->glos(); ppies->ruch(); ppies->sen(); system("pause"); } Pies je Hau Ssak chodzi Ssak spi Press any key to continue... 25

Funkcja Ssak Pies Przesłonięcie Ruch() NIE Sen() virtual NIE Glos() virtual TAK Glod() virtual virtual TAK Wniosek: Funkcje wirtualne w klasie bazowej są przesłonięte 26

Działanie funkcji wirtualnych Funkcja wirtualna jest śledzona przez obiekt kompilator tworzy tablicę funkcji wirtualnych v-table, która jest przechowywana dla każdego typu, a każdy obiekt tego typu przechowuje wskaźnik do niej vptr, vpointer. Część Ssak Obiekt Pies 27

VPTR &Ruch Ssak &Glos VPTR Ssak &Ssak:Ruch() &Pies:Glos() Pies 28

// Wielokrotne użycie funkcji wirtualnych #include<iostream> using std::cout; using std::cin; class Ssak virtual void Glos()cout<<"Glos ssaka\n";} class Pies : public Ssak void Glos()cout<<"Hau\n";} class Kot : public Ssak void Glos()cout<<"Miau\n";} 29

class Kon : public Ssak void Glos()cout<<"Ihaaaa!\n";} class Swinka : public Ssak void Glos()cout<<"Kwik!\n";} void main() Ssak* zwierzeta[5]; Ssak* ptr; int wybor, i; for (i = 0; i < 5; i++) cout<<"(1)pies (2)kot (3)kon (4)swinka : "; cin>>wybor; 30

switch (wybor) case 1: ptr = new Pies; break; case 2: ptr = new Kot; break; case 3: ptr = new Kon; break; case 4: ptr = new Swinka; break; default: ptr = new Ssak; break; } zwierzeta[i] = ptr; } for (i = 0; i < 5; i++) zwierzeta[i]->glos(); } system("pause"); 31

(1)pies (2)kot (3)kon (4)swinka : 0 (1)pies (2)kot (3)kon (4)swinka : 1 (1)pies (2)kot (3)kon (4)swinka : 2 (1)pies (2)kot (3)kon (4)swinka : 3 (1)pies (2)kot (3)kon (4)swinka : 4 Glos ssaka Hau Miau Ihaaaa! Kwik! Press any key to continue... 32

/* Okrajanie przy przekazywaniu argumentów przez wartość*/ #include<iostream> using namespace std; class Ssak virtual void Glos()cout<<"Glos ssaka\n";} class Pies : public Ssak void Glos()cout<<"Hau\n";} class Kot : public Ssak void Glos()cout<<"Miau\n";} 33

/*przekazanie parametrów przez wartość, wskaźnik i referencję*/ void Wartosc(Ssak s) s.glos();} void Wskaznik(Ssak* p) p->glos();} void Referencja(Ssak& r) r.glos(); } void main() Ssak* ptr = 0; int wybor; while (1) bool Wyjscie = false; cout<<"(1)pies (2)kot (0)wyjscie : "; cin>>wybor; 34

switch (wybor) case 0: Wyjscie = true; break; case 1: ptr = new Pies; break; case 2: ptr = new Kot; break; default: ptr = new Ssak; break; } if(wyjscie) break; Wskaznik(ptr); Wartosc(*ptr); Referencja(*ptr); } system("pause"); } 35

(1)pies (2)kot (0)wyjscie : 1 Hau Glos ssaka Hau (1)pies (2)kot (0)wyjscie : 2 Miau Glos ssaka Miau (1)pies (2)kot (0)wyjscie : 0 Press any key to continue... 36

//Działanie modyfikatora const //w funkcjach wirtualnych #include <iostream> using namespace std; class Czolg virtual void Armata() cout<<"armata"<<endl;} virtual void Naped() cout<<"naped"<<endl;} virtual void Zaloga()const cout<<"4-5"<<endl;} class T34 : public Czolg virtual void Armata() cout<<"f-34"<<endl;} 37

virtual void Naped() const cout<<"diesel"<<endl;} virtual void Zaloga() cout<<"4"<<endl;} class Panther: public Czolg virtual void Armata()const cout<<"kwk-43"<<endl;} virtual void Naped() cout<<"benzyna"<<endl;} virtual void Zaloga()const cout<<"5"<<endl;} void main() cout<<"tworzymy obiekty :\n\n"; T34 Rudy; cout<<"\nt - 34\n"; Rudy.Armata(); 38

Rudy.Naped(); Rudy.Zaloga(); Panther Nr_101; cout<<"\npanther\n"; Nr_101.Armata(); Nr_101.Naped(); Nr_101.Zaloga(); cout<<"\n Wskazniki do klasy czolg\n"; Czolg* czolgi[4]; cout<<"\nt - 34\n"; czolgi[0]=new T34; czolgi[0]->armata(); czolgi[0]->naped(); czolgi[0]->zaloga(); czolgi[1]=new Panther; cout<<"\npanther\n"; czolgi[1]->armata(); czolgi[1]->naped(); czolgi[1]->zaloga(); system ("pause"); } 39

Tworzymy obiekty : T - 34 F-34 diesel 4 Panther KwK-43 benzyna 5 Wskazniki do klasy czolg T - 34 F-34 naped 4-5 Panther armata benzyna 5 Press any key to continue... 40

Funkcja Czolg T34 Panther Armata() const Naped() const Zaloga() const const Wniosek: Zakreślone są funkcje przesłonięte w klasie potomnej. Aby funkcja została przesłonięta, musi być const lub nie w obu klasach : bazowej i potomnej. Jeśli modyfikator const występuje tylko w jednej z nich funkcja klasy bazowej nie jest przesłonięta w klasie potomnej 41

Przeładowanie i przesłanianie (polimorfizm) funkcji Przeładowanie funkcji Funkcje mają te same nazwy, należą do tej samej klasy, różnią się listą parametrów lub zwracanym typem Przesłanianie funkcji Funkcje mają te same nazwy, te same listy parametrów i typy zwracane, ale należą do różnych klas 42