Dziedziczenie. Literatura:

Wielkość: px
Rozpocząć pokaz od strony:

Download "Dziedziczenie. Literatura:"

Transkrypt

1 Literatura: Slajdy do wykładu drugiego, trzeciego i czwartego. Stanley B. Lippman Josee Lajoie Podstawy języka C++. Stanley B. Lippman Istota języka C++. Bruce Eckel Thinking in C++ edycja polska. Bjarne Stroustrup Język C++. 1 class Podstawowa int priv; int publ; int prot; Podstawowa (int a) : priv (a), publ (2*a), prot (-a) void f(int); void wypisz ( ) const; W wyniku dziedziczenia w klasie Pochodna znajdą się wszystkie pola i prawie wszystkie metody z klasy Podstawowa. Dziedziczenie Jeśli w programie chcielibyśmy utworzyć klasę podobną do klasy Podstawowa, różniącą się w kilku szczegółach, wystarczy skorzystać z techniki programowania zwanej dziedziczeniem. class Pochodna : public Podstawowa Klasa Podstawowa musi być już zdefiniowana. double dodatek; Pochodna (double a, int b) : dodatek (a), Podstawowa (b) void g ( ); void wypisz ( ) const; 2 Klasa pochodna dziedziczy składowe klasy podstawowej oprócz: konstruktorów, destruktora, operatorów przypisania. W klasie pochodnej możemy: zdefiniować dodatkowe pola, zdefiniować dodatkowe metody, przedefiniować pola i metody, które istnieją w klasie podstawowej. Dostęp do składowych (przy dziedziczeniu publicznym): składowe prywatne klasy (etykieta private) dostępne są wyłącznie w metodach tej klasy oraz jej funkcjach (metodach, klasach) zaprzyjaźnionych, składowe publiczne klasy (etykieta public) dostępne są w całym programie, składowe chronione klasy (etykieta protected) dostępne są w metodach tej klasy i jej funkcjach (metodach, klasach) zaprzyjaźnionych oraz w metodach klasy pochodnej i funkcjach (metodach, klasach) zaprzyjaźnionych z klasą pochodną. Etykieta protected pozwala więc, by klasa posiadała inny interfejs wobec programu zewnętrznego, aniżeli w stosunku do jej klas pochodnych. Program zewnętrzny sięga do jej sekcji publicznej podczas, gdy klasy pochodne mogą także korzystać z metod i pól zadeklarowanych w jej części chronionej. Użycie etykiety protected nie chroni już tak skutecznie implementacji klasy, jak etykieta private. Gdyby zaszła konieczność zmodyfikowania klasy bazowej (podstawowej), wówczas należałoby również przeredagować wszystkie klasy 3 pochodne, które bezpośrednio korzystają z komponentów protected klasy bazowej. Przykład class Podstawowa int priv; int publ; int prot; Podstawowa (int a) : priv (a), publ (2*a), prot (-a) void f(int); void wypisz ( ) const; void Podstawowa::f ( ) priv=1; publ=2; prot=3; void Podstawowa::f (int liczba) priv=publ=prot=liczba; void Podstawowa::wypisz ( ) const cout<<priv<<endl <<publ<<endl <<prot<<endl; 4

2 class Pochodna : public Podstawowa double dodatek; Pochodna (double a, int b) : dodatek (a), Podstawowa (b) void g ( ); void wypisz ( ) const; void Pochodna::g ( ) priv=10; błąd brak dostępu publ=20; prot=30; dodatek=15.7; void Pochodna::wypisz ( ) const Podstawowa::wypisz ( ); cout<<dodatek<<endl; Podstawowa A(5); A.priv=1; A.publ=2; A.prot=3; Pochodna B(1.2, 6); B.priv=1; B.publ=2; B.prot=3; 5 Podstawowa A(5); cout<<"podstawowa A"<<endl; A.wypisz ( ); Pochodna B (12.5, 10); cout<<"pochodna B"<<endl; B.wypisz ( ); B.g( ); B.f( ); cout<<"podstawowa B"<<endl; B.Podstawowa::wypisz ( ); Wynik działania programu: Podstawowa A Pochodna B Podstawowa B Ukrywanie nazw w klasie pochodnej W klasie Pochodna przedefiniowaliśmy metodę wypisz (w tym przypadku zmianie uległa treści metody), ukryliśmy tym samym w klasie Pochodna metodę wypisz klasy Podstawowa, którą można jedynie wywołać w sposób jawny, tzn. nazwę metody musimy poprzedzić nazwą klasy, czyli B.Podstawowa::wypisz ( ); Jeśli w przedefiniowywanej w klasie pochodnej metodzie, zmienimy typ zwracanej wartości lub/i argumenty metody, to również mamy do czynienia z ukrywaniem metody z klasy bazowej (podstawowej) w klasie pochodnej i tylko w sposób jawny możemy ją wywołać (tzn. j.w.). Taką samą mamy sytuację dla pól klasy. Jeśli przedefiniowujemy metody, których nazwa jest przeciążona w klasie bazowej (podstawowej), to wszystkie pozostałe wersje tej metody są automatycznie ukrywane w nowej, pochodnej klasie. 7 class Podstawowa // int publ; void f(int); // class Pochodna2 : public Podstawowa Przykłady Pochodna2 ( ) : Podstawowa (0) Pochodna2 C; C.f( ); // C.Pochodna2::f( ); C.f(10); //błąd metoda Podstawowa::f(int) została ukryta w klasie Pochodna2, można ją wywołać w sposób jawny tzn. C.Podstawowa::f(10); class Pochodna3 : public Podstawowa Pochodna3 ( ) : Podstawowa (-5) int f ( ); Pochodna3 D; int x=d.f ( ); //int x=d.pochodna3::f ( ); D.f (-5); //błąd metoda Podstawowa::f (int); jest ukryta w klasie Pochodna3 class Pochodna4 : public Podstawowa double publ; Pochodna4 ( ) : publ (0), Podstawowa (8) Pochodna4 E; cout<<e.publ; cout<<e.podstawowa::publ; 8

3 class Podstawowa // int publ; void f(int); // class Pochodna3bis : public Podstawowa Pochodna3bis ( ) : Podstawowa (-5) using Podstawowa::f; int f ( ); class Pochodna2bis : public Podstawowa Przykłady inaczej Pochodna2bis ( ) : Podstawowa (0) using Podstawowa::f; Pochodna2bis C; C.f( ); // C.Pochodna2bis::f( ); C.f(10); //C.Podstawowa::f(10) Pochodna3bis D; int x=d.f ( ); //int x=d.pochodna3bis::f ( ); D.f (-5); //D.Podstawowa::f (-5); 9 Konstruktor i destruktor klasy pochodnej class Test1 Test1 (int a) : a1 (a) cout<<"konstruktor Test1"<<endl; ~Test1 ( ) cout<<"destruktor Test1"<<endl; int a1; class Test2 Test2 (int b=10) : a2 (b) cout<<"konstruktor Test2"<<endl; ~Test2 ( ) cout<<"destruktor Test2"<<endl; int a2; Pisząc: Pochodna P (2); na ekranie zobaczymy: Konstruktor Test1 Konstruktor Test2 ****!!!!! Destruktor Test2 Destruktor Test1 class Pochodna : public Test1 Pochodna (int a) : t2(5), b(12), Test1(a) cout<<"****"<<endl; ~Pochodna ( ) cout<<"!!!!!"<<endl; Test2 t2; int b; 10 Kolejność wywoływania konstruktorów nie zależy od kolejności ich występowania na liście, ale od związków zachodzących między klasami. Destruktory wywoływane są w kolejności odwrotnej do wywołań konstruktorów. Konstrukcja obiektu klasy pochodnej zaczyna się od wywołania konstruktora klasy pochodnej, który wywołuje konstruktor klasy bazowej, a następnie zostaną zainicjowane pola klasy pochodnej (w przypadku pól, które są obiektami, zostaną wywołane odpowiednie konstruktory) zgodnie z kolejnością deklaracji w klasie. W klasie pochodnej bez jawnej definicji konstruktora (w tym też bez konstruktora kopiującego), konstruktor domyślny jest generowany automatycznie przez kompilator pod warunkiem, że w klasie bazowej istnieje i jest dostępny konstruktor domyślny oraz wszystkie pola klasy pochodnej mają szanse być poprawnie zainicjowanymi. Konstruktory i destruktor nie są dziedziczone. W klasie pochodnej konstruktor kopiujący jest generowany automatycznie przez kompilator, w którym kopiowanie odbywa się składowa po składowej, co w przypadku dziedziczenia oznacza uruchomienie konstruktora kopiującego klasy podstawowej, pod warunkiem, że istnieje i jest dostępny. Jeśli konstruktor kopiujący klasy podstawowej nie jest dostępny, to kompilator nie wygeneruje konstruktora kopiującego dla klasy pochodnej. W tym przypadku, o ile 11to jest konieczne, możemy konstruktor kopiujący zdefiniować samodzielnie. Operator przypisania nie jest dziedziczony. W klasie pochodnej operator przypisania jest generowany automatycznie przez kompilator, który jest przypisaniem składowa po składowej, co w przypadku dziedziczenia oznacza uruchomienie operatora przypisania klasy podstawowej pod warunkiem, że istnieje i jest dostępny. Gdy klasa podstawowa zawiera pola const lub/i pola będące referencjami, to operator przypisania nie zostanie automatycznie wygenerowany, gdyż do tych pól nie można nic przypisać. Gdy klasa podstawowa posiada prywatny operator przypisania, to kompilator również nie wygeneruje operatora przypisania dla klasy pochodnej. W tych przypadkach, jak również w przypadku, gdy automatycznie wygenerowany operator przypisania nam nie odpowiada możemy sami go zdefiniować. 12

4 Definicja konstruktora kopiującego i operatora przypisania dla klasy pochodnej. #include <iostream> using std::cout; class Podstawowa int numer; double kwota; Podstawowa (int a=1, double b=0) : numer (a), kwota (b) Podstawowa (const Podstawowa& wzor); //konstruktor kopiujący Podstawowa& operator= (const Podstawowa& co); //operator przypisania void wypisz() const cout<<'\n'<<numer<<" "<<kwota<<" "; Podstawowa::Podstawowa (const Podstawowa& wzor) : numer (wzor.numer+1), kwota (wzor.kwota) Podstawowa& Podstawowa::operator= (const Podstawowa& co) if (this==&co) return *this; numer=co.numer+1; kwota=co.kwota; return *this; 13 class Pochodna : public Podstawowa int ilosc; Pochodna (int c=10) : ilosc (c) Pochodna (const Pochodna& wzor); Pochodna & operator= (const Pochodna& co); void wypisz( ) const Podstawowa::wypisz();cout<<ilosc<<'\n'; Pochodna ::Pochodna (const Pochodna& wzor) : Podstawowa (wzor), ilosc(wzor.ilosc) Pochodna& Pochodna::operator= (const Pochodna& co) if (this==&co) return *this; Podstawowa::operator= (co); ilosc=co.ilosc+100; return *this; //konstruktor kopiujący //operator przypisania konwersja Pochodna& Podstawowa& 14 int main() Podstawowa a(2,3); Pochodna P(4), B=P; a.wypisz(); P.wypisz(); B.wypisz(); P=B; P.wypisz(); a=b; a.wypisz(); Podstawowa b=b; b.wypisz(); Standardowe konwersje. Rzutowanie w górę. Obiekt klasy pochodnej można uznać za obiekt klasy podstawowej. Predefiniowane są następujące konwersje standardowe: wskaźnik do obiektu klasy pochodnej może być niejawnie przekształcony na wskaźnik do obiektu klasy podstawowej. Pochodna* Podstawowa* referencja obiektu klasy pochodnej może być niejawnie przekształcona na referencję do obiektu klasy podstawowej. Pochodna& Podstawowa& Poprawne są więc linie: Pochodna P; Podstawowa T=P; // W linii zostanie wywołany konstruktor kopiujący Podstawowa::Podstawowa (const Podstawowa&); którego argumentem jest referencja do obiektu klasy Podstawowa. W naszym przykładzie po prawej stronie znaku = znajduje się obiekt klasy Pochodna. Wykonanie konstruktora kopiującego rozpocznie się wykonaniem konwersji Pochodna& Podstawowa&. Natomiast błędem zakończy się próba kompilacji następujących linii: Podstawowa T; 16 Pochodna P=T; //błąd niemożliwa jest konwersja Podstawowa& Pochodna&

5 W przypadku operatora przypisania sytuacja wygląda analogicznie. Pochodna P; Podstawowa T; T=P; // W linii przypadku zostanie wywołana metoda operatorowa Podstawowa& Podstawowa::operator= (const Podstawowa&); której argumentem jest referencja do obiektu klasy Podstawowa, tu również na początku zostanie wykonana konwersja Pochodna& Podstawowa&, ponieważ po prawej stronie operatora przypisania stoi obiekt klasy Pochodna. Rozważmy następującą hierarchię klas: class Samochod int zbiornik; class Mercedes : public Samochod class Fiat : public Samochod void stacja_benzynowa (Samochod &klient) klient.zbiornik+=50; Samochod idealny; stacja_benzynowa (idealny); spalanie (&idealny); Zdefiniujemy dwie funkcje stacja_benzynowa(samochod&) i spalanie(samochod*), które mogą pracować z każdym obiektem klasy pochodzącej od klasy Samochod. void spalanie (Samochod *wsk) wsk->zbiornik-=5; Niejawne konwersje użytkownik klasy może wykonać tylko przy dziedziczeniu publicznym. Sposób dziedziczenia określamy na liście pochodzenia klasy. Mercedes m_piotra; stacja_benzynowa (m_piotra); spalanie (&m_piotra); // Mercedes& Samochod& // Mercedes* Samochod* 17 Fiat f_pawla; stacja_benzynowa (f_pawla); spalanie (&f_pawla); // Fiat& Samochod& // Fiat* Samochod* 18 Lista pochodzenia klasy Na liście pochodzenia klasy, zamiast public (wykorzystywane najczęściej) mogą pojawić się etykiety private, protected. Etykiety określają w jaki sposób mają być traktowane składowe nieprywatne (składowe public i protected) klasy podstawowej w klasie pochodnej. class Pochodna: public Podstawowa składowe publiczne i chronione (public i protected) klasy Podstawowa mają ten sam specyfikator dostępu w klasie Pochodna. class Pochodna: private Podstawowa składowe nieprywatne klasy Podstawowa są składowymi prywatnymi klasy Pochodna. class Pochodna: protected Podstawowa składowe nieprywatne klasy Podstawowa są składowymi chronionymi klasy Pochodna. Domyślna etykietą na liście inicjalizującej jest etykieta private. 19 W przypadku dziedziczenia prywatnego użytkownik klasy nie może korzystać z niejawnych konwersji w górę. class Samochod int zbiornik; class Dom : private Samochod void stacja_benzynowa (Samochod &klient) klient.zbiornik+=50; Dom moj_dom; //stacja_benzynowa (moj_dom); błąd stacja_benzynowa ((Samochod&) moj_dom); W przypadku dziedziczenia prywatnego możliwe są tylko jawne konwersje. 20

6 class Przodek int i; float f; void fun1 (int, float); long l; int fun2 (double); class Potomek : private Przodek int dodatek; Przodek::i; Przodek::fun1; Przodek::fun2; W przypadku dziedziczenia prywatnego możemy wybiórczo udostępniać składowe publiczne i chronione klasy podstawowej. W deklaracjach dostępu podajemy same nazwy składowych z klasy bazowej. Nie można zmienić rodzaju dostępu do składowych udostępnianych w klasach pochodnych. 21 Klasa może wywodzić się od więcej niż jednej klasy, mówimy wtedy o dziedziczeniu wielobazowym. class B void metoda ( ); class C void metoda ( ); class A : public B, public C Klasy podstawowe umieszczamy na liście pochodzenia klasy pochodnej poprzedzając ich nazwy odpowiednimi etykietami. Dość często w przypadku dziedziczenia wielobazowego pojawiają się błędy niejednoznaczności. Najprostszym przypadkiem takiego błędu jest próba dziedziczenia przez klasę potomną składowej o nazwie, która występuje w więcej niż jednej klasie bazowej. Pisząc obiekt.metoda ( ); spowodujemy reakcję kompilatora np. następującą [C++ Error] Member is ambiguous: 'B::metoda' and 'C::metoda' W tym przypadku należy jawnie napisać z której klasy ma być wywołana metoda tzn. obiekt.c::metoda(); lub obiekt.b::metoda( ); 22 class X int x; X( ):x(-5) cout<<"konst X"<<endl; class B : public X int y; B( ) cout<<"konst B"<<endl; class C : public X int z; C( ) cout<<"konst C"<<endl; int main( ) cout<<sizeof(obiekt)<<endl; Wynik konst X konst B konst X konst C konst A 20 class X int x; X( ):x(-5) cout<<"konst X"<<endl; class B : public X int y; B( ) cout<<"konst B"<<endl; class C : public X int z; C( ) cout<<"konst C"<<endl; int main( ) cout<<sizeof(obiekt)<<endl; class A : public B, public C int h; A( ) cout<<"konst A"<<endl; 23 class A : public B, public C int h; [C++ Error] Member is ambiguous: 'X::x' and 'X::x' 24 A( ) cout<<x<<" konst A"<<endl;

7 class X int x; X( ):x(-5) cout<<"konst X"<<endl; class B : virtual public X int y; B( ) cout<<"konst B"<<endl; class C : virtual public X int z; C( ) cout<<"konst C"<<endl; int main( ) cout<<sizeof(obiekt)<<endl; Wynik konst X konst B konst C -5 konst A 24 Problemy z konstruktorem w hierarchiach z wirtualnymi klasami bazowymi class X int x; X(int a) :x(a) cout<<"konst X "<<x<<endl; class B : public X int y; B( ): X(2) cout<<"konst B"<<endl; class C : public X int z; C( ): X(120) cout<<"konst C"<<endl; int main( ) cout<<sizeof(obiekt)<<endl; Wynik konst X 2 konst B konst X 120 konst C konst A 20 class A : public B, public C int h; A( ) cout<<x<<" konst A"<<endl; 25 class A : public B, public C int h; A( ) cout<<"konst A"<<endl; 26 Problemy z konstruktorem w hierarchiach z wirtualnymi klasami bazowymi class X int x; X(int a) :x(a) cout<<"konst X "<<x<<endl; class B : virtual public X int y; B( ): X(2) cout<<"konst B"<<endl; class C : virtual public X int z; C( ): X(120) cout<<"konst C"<<endl; class A : public B, public C int h; A( ): X(456) cout<<"konst A"<<endl; int main( ) cout<<sizeof(obiekt)<<endl; Wynik konst X 456 konst B konst C konst A Polimorfizm i metody wirtualne. #include <iostream> using std::cout; using std::endl; cout<<""<<endl; cout<<"gra flet"<<endl; cout<<"gra trabka"<<endl; void muzyka (const Instrument& i) i.graj ( ); Trabka t; Flet f; muzyka (t); muzyka (f); Na ekranie zobaczymy. 28

8 Ten sam kod z dopisanym słowem virtual przed deklaracją metody Instrument::graj() wygeneruje inny wynik Ten sam kod z dopisanym słowem const po deklaracji metody Instrument::graj() wygeneruje wynik virtual cout<<""<<endl; cout<<"gra flet"<<endl; void muzyka (const Instrument& i) i.graj ( ); Trabka t; Flet f; muzyka (t); muzyka (f); virtual cout<<""<<endl; cout<<"gra flet"<<endl; void muzyka (const Instrument& i) i.graj ( ); Trabka t; Flet f; muzyka (t); muzyka (f); Na ekranie zobaczymy. Gra trabka Gra flet cout<<"gra trabka"<<endl; 29 [C++ Warning] Non-const function Instrument::graj() called for const object cout<<"gra trabka"<<endl; Na ekranie zobaczymy. [C++ Warning] 'Flet::graj()' hides virtual function 'Instrument::graj() const' 30 [C++ Warning] 'Trabka::graj()' hides virtual function 'Instrument::graj() const' Ten sam kod z dopisanym słowem const po deklaracji metody graj() w całej hierarchii dziedziczenia wygeneruje wynik Ten sam kod z dopisanym z argumentem przekazywanym przez wartość do funkcji muzyka virtual cout<<""<<endl; cout<<"gra flet"<<endl; void muzyka (const Instrument& i) i.graj ( ); Trabka t; Flet f; muzyka (t); muzyka (f); virtual cout<<""<<endl; cout<<"gra flet"<<endl; void muzyka (const Instrument i) i.graj ( ); Trabka t; Flet f; muzyka (t); muzyka (f); cout<<"gra trabka"<<endl; Na ekranie zobaczymy. Gra trabka Gra flet 31 cout<<"gra trabka"<<endl; Na ekranie zobaczymy. 32

9 Metodę zadeklarowaną ze słowem kluczowym virtual, nazywamy metodą wirtualną. Wirtualne mogą być tylko metody klasy. Wirtualny nie może być konstruktor i metody statyczne. Słowo virtual umieszczamy w treści klasy w momencie deklaracji metody, w definicji metody słowa virtual nie powtarzamy. Funkcja wirtualna w klasie podstawowej jest również wirtualna we wszystkich jej klasach pochodnych. W treści klasy pochodnej w deklaracji można powtórzyć słowo virtual, ale nie jest to konieczne. Wróćmy do treści funkcji muzyka. Linia z programu z metodami wirtualnymi i.graj ( ); produkuje różne wyniki, takie zachowanie nazywamy polimorficznym, a zjawisko polimorfizmem. Pisząc w treści funkcji main muzyka (t); // wywołujemy metodę i.trabka::graj ( ); w funkcji muzyka muzyka (f); // wywołujemy metodę i.flet::graj ( ); w funkcji muzyka Mechanizm wywołania metody jako metody wirtualnej ujawnia się tylko wtedy, gdy wywołujemy metodę wirtualną za pomocą adresu tzn. referencji lub wskaźnika do obiektu klasy podstawowej. O tym którą wersję funkcji wywołamy decyduje nie typ referencji lub wskaźnika, ale to, z czym referencja jest związana lub na co pokazuje 33 wskaźnik. Wyprowadzając nowe typy danych (np. Fortepian, Gitara) ze wspólnej klasy podstawowej (u nas Instrument), nie musimy wprowadzać jakichkolwiek zmian w funkcjach, odwołujących się do interfejsu klasy podstawowej (u nas funkcja muzyka), tak by mogły one obsługiwać nowo utworzone klasy. Domyślnie metody klas nie są wirtualne (tak jak np. w Javie) bo: (a) obiekty takich klas, są trochę większe, a programy pracujące z takimi klasami trochę wolniejsze; (b) nie można by też było stosować funkcji inline. Metody wirtualne mogą być typu inline, ale w sytuacji gdy wywołanie metody odbywa się na rzecz obiektu klasy pochodnej pokazywanego wskaźnikiem (referencją) do klasy podstawowej wtedy inline jest ignorowane. Natomiast w przypadku jawnego wywołania oraz wywołania na rzecz obiektu inline nie jest ignorowane. Klasa pochodna nie musi koniecznie definiować swojej wersji metody wirtualnej, zawsze może korzystać z wersji odziedziczonej z klasy podstawowej. Przedefiniowując metodę wirtualną w klasie pochodnej, należy pamiętać o zgodności nazwy, typów argumentów i typu wartości, o ile chcemy korzystać z mechanizmu obsługującego metody wirtualne. Jedyną akceptowalną zmianą jest zastąpienie typu wartości metody wirtualnej, typem, który niejawnie daje się przekonwertować na typ pojawiający się w pierwszej deklaracji funkcji wirtualnej w hierarchii dziedziczenia, dotyczy to tylko typów definiowanych przez użytkownika. 34 class Moja virtual Moja& funkcja ( ) return *this; class Pochodna : public Moja Pochodna& funkcja ( ) return *this; class Pochodna2 : public Moja Moja& funkcja ( ) return *this; rzutowanie w górę Problemy mogą się pojawić w momencie wykorzystywania zwracanej wartości, mianowicie: Pochodna a; Pochodna c=a.funkcja( ); Pochodna2 A; // Pochodna2 C=A.funkcja( ); Pochodna2 C=dynamic_cast<Pochodna2&>(A.funkcja( 35)); Typ statyczny wskaźnika (referencji) określa sposób dostępu do metody wirtualnej. W określaniu dostępu typ dynamiczny wskaźnika (referencji) nie jest brany pod uwagę. class Moja virtual void funkcja ( ); class Pochodna1 : public Moja void funkcja ( ); class Pochodna2 : public Pochodna1 void funkcja ( ); Moja *M=new Pochodna1; M->funkcja ( ); // dostęp publiczny do Pochodna1::funkcja () Moja *N=new Pochodna2; N->funkcja ( ); // dostęp publiczny do Pochodna2::funkcja () Pochodna1 *P=new Pochodna2; P->funkcja ( ); //błąd dostęp chroniony do Pochodna2::funkcja () 36

10 Klasa zawierająca metody wirtualne powinna zawierać destruktor wirtualny. #include <iostream> using std::cout; using std::endl; class Moja virtual void funkcja ( ) cout<<"moja "; virtual ~Moja ( ) cout<<"destr.m. <<endl; Moja *M=new Pochodna1; M->funkcja ( ); Moja *N=new Pochodna2; N->funkcja ( ); delete M; delete N; Klasyczne metody od metod wirtualnych różnią się sposobem wiązania tzn. łączenia wywołania metody z jej treścią, tzn.: w klasycznych metodach już na etapie kompilacji odbywa się powiązanie wywołań metod z adresem określającym, gdzie te metody się znajdują, natomiast w przypadku metod wirtualnych, kompilator generuje kod dzięki któremu decyzja o powiązaniu wywołania metody z określoną wersją metody wirtualnej jest podejmowana na etapie wykonania programu, tak więc mamy dwa sposoby wiązania: wczesne wiązanie na etapie kompilacji późne wiązanie na etapie wykonania programu. class Pochodna1 : public Moja void funkcja ( ) cout<<"pochodna1 "; ~Pochodna1 ( ) cout<<"destr.p1. <<endl; class Pochodna2 : public Pochodna1 void funkcja ( ) cout<<"pochodna2 "; ~Pochodna2 ( ) cout<<"destr.p2. <<endl; Pochodna1 Pochodna2 destr.p1. destr.m. destr.p2. destr.p1. destr.m. 37 class Moja virtual void funkcja ( ); Moja A; A.funkcja ( ); //. Moja *wsk; //.. wsk->funkcja ( ); wsk->moja::funkcja ( ); 38 W jaki sposób język C++ realizuje późne wiązanie? Typowy kompilator, dla każdej klasy zawierającej metody wirtualne tworzy pojedynczą tablicę VTABLE. W tablicy VTABLE umieszczane są adresy metod wirtualnych klasy. W każdym obiekcie reprezentującym klasę posiadającą metody wirtualne, niejawnie umieszczany jest wskaźnik wirtualny VPTR wskazujący na tablicę VTABLE tej klasy. Wszystkie obiekty klasy podstawowej, a także jej klas pochodnych, posiadają wskaźnik VPTR na tym samym miejscu (często na początku obiektu). Wszystkie adresy metod wirtualnych zawartych w tablicy VTABLE są ułożone w tym samym porządku, niezależnie od konkretnego typu obiektu. Wskaźnik VPTR jest inicjowany niejawnie w konstruktorze klasy. W momencie wywołania metody wirtualnej za pomocą wskaźnika (referencji) do obiektów klasy podstawowej, kompilator niejawnie wstawia kod, pobierający wskaźnik VPTR i odnajdujący adres metody wirtualnej w tablicy VTABLE, co umożliwia wywołanie odpowiedniej metody w trakcie pracy programu. To wszystko dla nas wykonuje kompilator. Wniosek Jeśli class Moja int a; virtual void funkcja ( ); class MOJA int a; void funkcja ( ); to sizeof (Moja) >sizeof (MOJA). 39 Przykład nieco dłuższy #include <iostream> #include <string> using std::cout; using std::endl; using std::string; virtual cout<<""<<endl; virtual string co ( ) const return "Instrument"; virtual void napraw ( ) virtual ~Instrument( ) cout<<":-("; cout<<"gra flet"<<endl; string co ( ) const return "Flet"; void napraw ( ) cout<<"naprawiam flet"<<endl; class Flet_prosty : public Flet cout<<"gra flet prosty"<<endl; string co ( ) const return "Flet prosty"; cout<<"gra trabka"<<endl; string co ( ) const return "Trabka"; void napraw ( ) cout<<"naprawiam trabke"<<endl; 40

11 Instrument *A[ ]=new Trabka, new Flet, new Flet_prosty for (int i=0; i<sizeof (A)/sizeof (*A) ; ++i) A[i]->graj ( ); for (int i=0; i<sizeof (A)/sizeof (*A) ; ++i) A[i]->napraw ( ); for (int i=0; i<sizeof (A)/sizeof (*A) ; ++i) delete A[i]; Na ekranie zobaczymy Gra trabka Gra flet Gra flet prosty Naprawiam trabke Naprawiam flet Naprawiam flet :-(:-(:-( 41 Przykład. Klasa abstrakcyjna. virtual =0; virtual string co ( ) const = 0; virtual void napraw ( ) =0; virtual ~Instrument( ) =0; cout<<"gra flet"<<endl; string co ( ) const return "Flet"; void napraw ( ) cout<<"naprawiam flet"<<endl; class Flet_prosty : public Flet cout<<"gra flet prosty"<<endl; string co ( ) const return "Flet prosty"; cout<<"gra trabka"<<endl; string co ( ) const return "Trabka"; void napraw ( ) cout<<"naprawiam trabke"<<endl; void Instrument::graj ( ) const cout<<""<<endl; string Instrument::co ( ) const Program z poprzedniego slajdu będzie return "Instrument"; 42 działał identycznie. Instrument ::~Instrument( ) cout<<":-("; Abstrakcyjne klasy podstawowe i metody czysto wirtualne. Klasa abstrakcyjna to klasa, która nie reprezentuje, żadnego konkretnego obiektu (np. klasa Ssak, klasa Figura, klasa Instrument). Metoda czysto wirtualna, to funkcja która oprócz słowa kluczowego virtual posiada adnotacje =0 na końcu deklaracji. Klasa z metodami czysto wirtualnymi jest klasą abstrakcyjną. Kompilator nie pozwoli nikomu na utworzenie obiektu takiej klasy, gdyż klasa abstrakcyjna to jakby niedokończona klasa. Dokończenie jej jest realizowane przez jej klasy pochodne. Klasy abstrakcyjne określają wspólny interfejs dla klas pochodnych. Klasy abstrakcyjne wprowadza się po to żeby je dziedziczyć. 43

PARADYGMATY PROGRAMOWANIA Wykład 4

PARADYGMATY PROGRAMOWANIA Wykład 4 PARADYGMATY PROGRAMOWANIA Wykład 4 Metody wirtualne i polimorfizm Metoda wirualna - metoda używana w identyczny sposób w całej hierarchii klas. Wybór funkcji, którą należy wykonać po wywołaniu metody wirtualnej

Bardziej szczegółowo

Dziedziczenie jednobazowe, poliformizm

Dziedziczenie jednobazowe, poliformizm Dziedziczenie jednobazowe, poliformizm 1. Dziedziczenie jednobazowe 2. Polimorfizm część pierwsza 3. Polimorfizm część druga Zofia Kruczkiewicz, ETE8305_6 1 Dziedziczenie jednobazowe, poliformizm 1. Dziedziczenie

Bardziej szczegółowo

TEMAT : KLASY DZIEDZICZENIE

TEMAT : KLASY DZIEDZICZENIE TEMAT : KLASY DZIEDZICZENIE Wprowadzenie do dziedziczenia w języku C++ Język C++ możliwa tworzenie nowej klasy (nazywanej klasą pochodną) w oparciu o pewną wcześniej zdefiniowaną klasę (nazywaną klasą

Bardziej szczegółowo

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

Programowanie 2. Język C++. Wykład 9. 9.1 Ukrywanie metod, metody nadpisane... 1 9.2 Metody wirtualne, wirtualny destruktor... 2 9.3 Metody czysto wirtualne... 6 9.4 Klasy abstrakcyjne... 7 9.5 Wielodziedziczenie... 9 9.1 Ukrywanie metod,

Bardziej szczegółowo

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Dariusz Wardowski dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Wirtualne destruktory class A int* a; A(int _a) a = new int(_a);} virtual ~A() delete a;} class B: public A double* b;

Bardziej szczegółowo

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

Wykład V. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej Wykład V - semestr II Kierunek Informatyka Wydział Matematyki Stosowanej Politechniki Śląskiej Gliwice, 2014 c Copyright 2014 Janusz Słupik Programowanie obiektowe Dziedziczenie (inheritance) - mechanizm

Bardziej szczegółowo

Dziedziczenie. Ogólna postać dziedziczenia klas:

Dziedziczenie. Ogólna postać dziedziczenia klas: Dziedziczenie Ogólna postać dziedziczenia klas: class nazwa_clasy_pochodnej : specyfikator_dostępu nazwa_clasy_bazowej specyfikator_dostępu : public private protected Specyfikator dostępu definiuje, w

Bardziej szczegółowo

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

Języki Programowania. Prowadząca: dr inż. Hanna Zbroszczyk.   tel: Konsultacje: piątek: Języki Programowania Prowadząca: dr inż. Hanna Zbroszczyk e-mail: gos@if.pw.edu.pl tel: +48 22 234 58 51 Konsultacje: piątek: 12.00 13.30 www: http://www.if.pw.edu.pl/~gos/students/jp Politechnika Warszawska

Bardziej szczegółowo

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

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi EGZAMIN PIERWSZY (25 CZERWCA 2013) JĘZYK C++ poprawiam ocenę pozytywną z egzaminu 0 (zakreśl poniżej x) 1. Wśród poniższych wskaż poprawną formę definicji

Bardziej szczegółowo

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

Programowanie 2. Język C++. Wykład 3. 3.1 Programowanie zorientowane obiektowo... 1 3.2 Unie... 2 3.3 Struktury... 3 3.4 Klasy... 4 3.5 Elementy klasy... 5 3.6 Dostęp do elementów klasy... 7 3.7 Wskaźnik this... 10 3.1 Programowanie zorientowane

Bardziej szczegółowo

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27 Programowanie w C++ Wykład 14 Katarzyna Grzelak 3 czerwca 2019 K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27 Na ostatnim wykładzie: Konstruktor standardowy (domyślny) to taki, który nie ma żadnych argumentów

Bardziej szczegółowo

Język C++ Programowanie obiektowe

Język C++ Programowanie obiektowe Język C++ Programowanie obiektowe Cechy programowania obiektowego abstrakcyjne typy danych hermetyczność obiektów (kapsułkowanie) dziedziczenie polimorfizm Programowanie proceduralne vs. programowanie

Bardziej szczegółowo

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

Składnia C++ Programowanie Obiektowe Mateusz Cicheński Składnia C++ Programowanie Obiektowe Mateusz Cicheński Klasy i modyfikatory dostępu Przesłanianie metod Polimorfizm Wskaźniki Metody wirtualne Metody abstrakcyjne i interfejsy Konstruktory i destruktory

Bardziej szczegółowo

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Zaawansowane programowanie w języku C++ Programowanie obiektowe Zaawansowane programowanie w języku C++ Programowanie obiektowe Prezentacja jest współfinansowana przez Unię Europejską w ramach Europejskiego Funduszu Społecznego w projekcie pt. Innowacyjna dydaktyka

Bardziej szczegółowo

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego Iwona Kochaoska Programowanie Obiektowe Programowanie obiektowe (ang. object-oriented programming) - metodyka tworzenia programów komputerowych,

Bardziej szczegółowo

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie? 1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie? a) konstruktor b) referencje c) destruktor d) typy 2. Które z poniższych wyrażeń są poprawne dla klasy o nazwie

Bardziej szczegółowo

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

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016 Wykład 2 17 marca 2016 Dziedziczenie Klasy bazowe i potomne Dziedziczenie jest łatwym sposobem rozwijania oprogramowania. Majac klasę bazowa możemy ja uszczegółowić (dodać nowe pola i metody) nie przepisujac

Bardziej szczegółowo

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

Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26 Programowanie w C++ Wykład 13 Katarzyna Grzelak 4 czerwca 2018 K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26 Klasy - powtórzenie Klasy typy definiowane przez użytkownika Klasy zawieraja dane składowe

Bardziej szczegółowo

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Programowanie obiektowe, wykład nr 6. Klasy i obiekty Dr hab. inż. Lucyna Leniowska, prof. UR, Zakład Mechatroniki, Automatyki i Optoelektroniki, IT Programowanie obiektowe, wykład nr 6 Klasy i obiekty W programowaniu strukturalnym rozwój oprogramowania oparto

Bardziej szczegółowo

Wstęp do Programowania 2

Wstęp do Programowania 2 Wstęp do Programowania 2 dr Bożena Woźna-Szcześniak bwozna@gmail.com Akademia im. Jana Długosza Wykład 5 W programowaniu obiektowym programista koncentruje się na obiektach. Zadaje sobie pytania typu:

Bardziej szczegółowo

Wprowadzenie do programowanie obiektowego w języku C++

Wprowadzenie do programowanie obiektowego w języku C++ Wprowadzenie do programowanie obiektowego w języku C++ Część czwarta Autor Roman Simiński Kontakt roman.siminski@us.edu.pl www.us.edu.pl/~siminski Niniejsze opracowanie zawiera skrót treści wykładu, lektura

Bardziej szczegółowo

Zaawansowane programowanie w C++ (PCP)

Zaawansowane programowanie w C++ (PCP) Zaawansowane programowanie w C++ (PCP) Wykład 3 - polimorfizm. dr inż. Robert Nowak - p. 1/14 Powtórzenie Powtórzenie: klasy autonomiczne: konstruktor, konstruktor kopiujacy, operator przypisania, destruktor

Bardziej szczegółowo

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

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej. Polimorfizm jest filarem programowania obiektowego, nie tylko jeżeli chodzi o język C++. Daje on programiście dużą elastyczność podczas pisania programu. Polimorfizm jest ściśle związany z metodami wirtualnymi.

Bardziej szczegółowo

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np Klasy Klasa jest nowym typem danych zdefiniowanym przez użytkownika Wartości takiego typu nazywamy obiektami Najprostsza klasa jest po prostu strukturą, np struct Zespolona { Klasy jako struktury z operacjami

Bardziej szczegółowo

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE. C++ - DZIEDZICZENIE Do najważniejszych cech języka C++ należy możliwość wielokrotnego wykorzystywania kodu Prymitywnym, ale skutecznym sposobem jest kompozycja: deklarowanie obiektów wewnątrz innych klas,

Bardziej szczegółowo

Mechanizm dziedziczenia

Mechanizm dziedziczenia Mechanizm dziedziczenia Programowanie obiektowe jako realizacja koncepcji ponownego wykorzystania kodu Jak przebiega proces dziedziczenia? Weryfikacja formalna poprawności dziedziczenia Realizacja dziedziczenia

Bardziej szczegółowo

Programowanie obiektowe w C++ Wykład 12

Programowanie obiektowe w C++ Wykład 12 Programowanie obiektowe w C++ Wykład 12 dr Lidia Stępień Akademia im. Jana Długosza w Częstochowie L. Stępień (AJD) 1 / 22 Zakresowe pętle for double tab[5] {1.12,2.23,3.33,4.12,5.22 for(double x: tab)

Bardziej szczegółowo

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

Składnia C++ Programowanie Obiektowe Mateusz Cicheński Składnia C++ Programowanie Obiektowe Mateusz Cicheński Klasy i modyfikatory dostępu Przesłanianie metod Polimorfizm Wskaźniki Metody wirtualne Metody abstrakcyjne i interfejsy Przeciążanie operatorów Słowo

Bardziej szczegółowo

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Java - tablice, konstruktory, dziedziczenie i hermetyzacja Java - tablice, konstruktory, dziedziczenie i hermetyzacja Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak PLAN WYKŁADU zmienne tablicowe konstruktory klas dziedziczenie hermetyzacja

Bardziej szczegółowo

PARADYGMATY PROGRAMOWANIA Wykład 3

PARADYGMATY PROGRAMOWANIA Wykład 3 PARADYGMATY PROGRAMOWANIA Wykład 3 Definiowanie operatorów i ich przeciążanie Przykłady zastosowania operatorów: a) operator podstawienia ( = ) obiektów o złożonej strukturze, b) operatory działania na

Bardziej szczegółowo

C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm POLIMORFIZM

C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm POLIMORFIZM POLIMORFIZM Podstawowe pytanie, które nieustannie ma towarzyszyć autorowi programowi: czy gdyby nagle okazało się, że jest więcej... (danych na wejściu, typów danych, czynności, które program ma wykonać,

Bardziej szczegółowo

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne Tematyka wykładów 1. Wprowadzenie. Klasy cz. 1 - Język C++. Programowanie obiektowe - Klasy i obiekty - Budowa i deklaracja klasy. Prawa dostępu - Pola i funkcje składowe - Konstruktor i destruktor - Tworzenie

Bardziej szczegółowo

Programowanie obiektowe w języku

Programowanie obiektowe w języku Programowanie obiektowe w języku C++ Stanisław Gepner sgepner@meil.pw.edu.pl Dziedziczenie Wstęp Zacznijmy od przykładu Przykład rolniczy Każde zwierzątko wydaje dźwięk Każde się tak samo porusza Musimy

Bardziej szczegółowo

C++ - [4-7] Polimorfizm

C++ - [4-7] Polimorfizm Slajd 1 z 14 C++ - [4-7] Polimorfizm Nysa 2004-2013. Autor: Wojciech Galiński. wersja dnia 20 maja 2013 r. Slajd 2 z 14 Polimorfizm i klasa polimorficzna POLIMORFIZM (cytat z Wikipedii) (wielopostaciowość)

Bardziej szczegółowo

Szablony klas, zastosowanie szablonów w programach

Szablony klas, zastosowanie szablonów w programach Szablony klas, zastosowanie szablonów w programach 1. Szablony klas i funkcji 2. Szablon klasy obsługującej uniwersalną tablicę wskaźników 3. Zastosowanie metody zwracającej przez return referencję do

Bardziej szczegółowo

Klasa dziedzicząca posiada wszystkie cechy klasy bazowej (plus swoje własne) dodawanie nowego kodu bez edycji (i ewentualnego wprowadzania

Klasa dziedzicząca posiada wszystkie cechy klasy bazowej (plus swoje własne) dodawanie nowego kodu bez edycji (i ewentualnego wprowadzania Programowanie przyrostowe Rzutowanie w górę Zaleta dziedziczenia i kompozycji jest programowanie przyrostowe: Klasa dziedzicząca posiada wszystkie cechy klasy bazowej (plus swoje własne) dodawanie nowego

Bardziej szczegółowo

PARADYGMATY PROGRAMOWANIA Wykład 2

PARADYGMATY PROGRAMOWANIA Wykład 2 PARADYGMATY PROGRAMOWANIA Wykład 2 Definiowanie klas w C++ - ciąg dalszy Lista inicjalizująca konstruktora Przeznaczenie - do inicjalizacji pól klasy z kwalifikatorem const i inicjalizacji obiektów składowych

Bardziej szczegółowo

Programowanie II. Lista 3. Modyfikatory dostępu plik TKLientBanku.h

Programowanie II. Lista 3. Modyfikatory dostępu plik TKLientBanku.h Programowanie II Lista 3 Modyfikatory dostępu plik TKLientBanku.h plik z funkcją main Przyjaźń Dziedziczenie Dziedziczenie to nic innego jak definiowanie nowych klas w oparciu o już istniejące. Jest to

Bardziej szczegółowo

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.

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. Programowanie uzupełnienie notatek: dr Jerzy Białkowski 1 2 3 4 Obiektowość języka C++ ˆ Klasa (rozszerzenie struktury), obiekt instancją klasy, konstruktory i destruktory ˆ Enkapsulacja - kapsułkowanie,

Bardziej szczegółowo

Programowanie Obiektowe i C++

Programowanie Obiektowe i C++ Programowanie Obiektowe i C++ Marcin Benke Instytut Informatyki UW 30.10.2006 Marcin Benke (IIUW) Programowanie Obiektowe i C++ 30.10.2006 85 / 112 Zgodność typów Rozważmy klasy class A { //... }; class

Bardziej szczegółowo

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU Inicjalizacja agregatowa zmiennej tablicowej int a[5] = 1,2,3,4,5 INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU Struktury są również agregatami, dlatego: struct X double f; char c; X x1 = 1, 2.2, 'c' Ale

Bardziej szczegółowo

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.: Program przedmiotu Programowanie Obiektowe (język C++) Wykład 1. Definiowanie prostych klas. Przykłady. Przypomnienie: typy referencyjne, domyślne wartości argumentów, przeciąŝanie funkcji. Konstruktory,

Bardziej szczegółowo

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

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc Rok akademicki 2016/2017, Wykład nr 4 2/45 Plan wykładu nr 4 Informatyka 2 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr III, studia stacjonarne I stopnia Rok akademicki 2016/2017

Bardziej szczegółowo

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

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this Wstęp do programowania obiektowego WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this 1 Nazwa typu Rozmiar Zakres Uwagi bool 1 bit wartości true albo false stdbool.h TYPY ZNAKOWE

Bardziej szczegółowo

Programowanie obiektowe i C++ dla matematyków

Programowanie obiektowe i C++ dla matematyków Programowanie obiektowe i C++ dla matematyków Bartosz Szreder szreder (at) mimuw... 10 I 2012 1 Zabronienie kopiowania Czasami nie ma sensu, żeby obiekty pewnego typu były kopiowane z innych obiektów.

Bardziej szczegółowo

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Dariusz Wardowski dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Przydzielanie pamięci Poniżej przedstawiono w C++ dwie klasy obrazujące sposób rezerwacji pamięci. class Osoba char imie[30];

Bardziej szczegółowo

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

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 20 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 32 Programowanie w C++ Wykład 12 Katarzyna Grzelak 20 maja 2019 K.Grzelak (Wykład 12) Programowanie w C++ 1 / 32 Klasy - powtórzenie Klasy typy definiowane przez użytkownika Klasy zawieraja dane składowe

Bardziej szczegółowo

.NET Klasy, obiekty. ciąg dalszy

.NET Klasy, obiekty. ciąg dalszy .NET Klasy, obiekty ciąg dalszy Przeciążanie operatorów 1 W języku C# istnieje możliwość zdefiniowania funkcjonalności dużej części operatorów dla typów stworzonych przez użytkownika. Dzięki takiemu zabiegowi,

Bardziej szczegółowo

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost; Klasy w C++ są bardzo ważnym narzędziem w rękach programisty. Klasy są fundamentem programowania obiektowego. Z pomocą klas będziesz mógł tworzyć lepszy kod, a co najważniejsze będzie on bardzo dobrze

Bardziej szczegółowo

TEMAT : KLASY POLIMORFIZM

TEMAT : KLASY POLIMORFIZM TEMAT : KLASY POLIMORFIZM 1. Wprowadzenie do polimorfizmu i funkcji wirtualnych w języku C++ Język C++ zakłada, że w pewnych przypadkach uzasadnione jest tworzenie klas, których reprezentanci w programie

Bardziej szczegółowo

dr inż. Jarosław Forenc

dr inż. Jarosław Forenc Informatyka 2 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr III, studia niestacjonarne I stopnia Rok akademicki 2012/2013 Wykład nr 6 (07.12.2012) dr inż. Jarosław Forenc Rok

Bardziej szczegółowo

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

2.4 Dziedziczenie. 2.4 Dziedziczenie Przykłady programowania w C - kurs podstawowy 2.4 Dziedziczenie Poprzednie dwa rozdziały które dotyczyły zagadnienia automatów komórkowych na przykładach programów w C++. Mogłyby one sugerować że niekoniecznie trzeba programować obiektowo aby napisać

Bardziej szczegółowo

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class). Wprowadzenie w dziedziczenie Klasa D dziedziczy klasę B: B klasa bazowa D klasa pochodna Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class). Najpierw jest tworzona klasa bazowa,

Bardziej szczegółowo

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

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 4. Karol Tarnowski A-1 p. Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni Wykład 4 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Przeciążanie operatorów Funkcje zaprzyjaźnione Na

Bardziej szczegółowo

Zaawansowane programowanie w języku C++ Klasy w C++

Zaawansowane programowanie w języku C++ Klasy w C++ Zaawansowane programowanie w języku C++ Klasy w C++ Prezentacja jest współfinansowana przez Unię Europejską w ramach Europejskiego Funduszu Społecznego w projekcie pt. Innowacyjna dydaktyka bez ograniczeń

Bardziej szczegółowo

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

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27 Programowanie w C++ Wykład 12 Katarzyna Grzelak 28 maja 2018 K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27 Klasy cd K.Grzelak (Wykład 12) Programowanie w C++ 2 / 27 Klasy - powtórzenie Klasy typy definiowane

Bardziej szczegółowo

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut. Dziedziczenie Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut. Rozpatrzmy przykład przedstawiający klasy Student oraz Pracownik: class Student class Pracownik

Bardziej szczegółowo

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE. C++ - DZIEDZICZENIE Do najważniejszych cech języka C++ należy możliwość wielokrotnego wykorzystywania kodu Prymitywnym, ale skutecznym sposobem jest kompozycja: deklarowanie pól obiektowych wewnątrz innych

Bardziej szczegółowo

Wykład 8: klasy cz. 4

Wykład 8: klasy cz. 4 Programowanie obiektowe Wykład 8: klasy cz. 4 Dynamiczne tworzenie obiektów klas Składniki statyczne klas Konstruktor i destruktory c.d. 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD

Bardziej szczegółowo

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

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30 Programowanie w C++ Wykład 11 Katarzyna Grzelak 13 maja 2019 K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30 Klasy cd K.Grzelak (Wykład 11) Programowanie w C++ 2 / 30 Klasy - powtórzenie Klasy typy definiowane

Bardziej szczegółowo

Zaawansowane programowanie w C++ (PCP)

Zaawansowane programowanie w C++ (PCP) Zaawansowane programowanie w C++ (PCP) Wykład 4 - wzorce projektowe. dr inż. Robert Nowak - p. 1/18 Powtórzenie klasy autonomiczne tworzenie nowych typów: dziedziczenie i agregacja dziedziczenie: przedefiniowywanie

Bardziej szczegółowo

Wykład 1. Program przedmiotu. Programowanie (język C++) Literatura. Program przedmiotu c.d.:

Wykład 1. Program przedmiotu. Programowanie (język C++) Literatura. Program przedmiotu c.d.: Program przedmiotu Programowanie (język C++) Wykład 1. Język C a C++. Definiowanie prostych klas. Typy referencyjne. Domyślne wartości argumentów. PrzeciąŜanie funkcji. Konstruktory, destruktory. Definiowanie

Bardziej szczegółowo

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

Język C++ Różnice między C a C++ Język C++ Różnice między C a C++ Plan wykładu C a C++ Różnice ogólne Typy Deklaracje zmiennych C++ jako rozszerzenie C Domyślne argumenty funkcji Przeciążanie funkcji Referencje Dynamiczny przydział pamięci

Bardziej szczegółowo

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

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p. Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni Wykład 3 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Abstrakcja funkcyjna Struktury Klasy hermetyzacja

Bardziej szczegółowo

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Polimorfizm, metody wirtualne i klasy abstrakcyjne Programowanie obiektowe Polimorfizm, metody wirtualne i klasy abstrakcyjne Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski pwr.wroc.pl Polimorfizm,

Bardziej szczegółowo

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

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy : Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy : class nazwa_klasy prywatne dane i funkcje public: publiczne dane i funkcje lista_obiektów;

Bardziej szczegółowo

Klasy abstrakcyjne i interfejsy

Klasy abstrakcyjne i interfejsy Klasy abstrakcyjne i interfejsy Streszczenie Celem wykładu jest omówienie klas abstrakcyjnych i interfejsów w Javie. Czas wykładu 45 minut. Rozwiązanie w miarę standardowego zadania matematycznego (i nie

Bardziej szczegółowo

Polimorfizm. dr Jarosław Skaruz

Polimorfizm. dr Jarosław Skaruz Polimorfizm dr Jarosław Skaruz http://jareks.ii.uph.edu.pl jaroslaw@skaruz.com O czym będzie? finalne składowe klasy abstrakcyjne interfejsy polimorfizm Finalne składowe Domyślnie wszystkie pola i metody

Bardziej szczegółowo

Wykład 5 Okna MDI i SDI, dziedziczenie

Wykład 5 Okna MDI i SDI, dziedziczenie Wykład 5 Okna MDI i SDI, dziedziczenie Autor: Zofia Kruczkiewicz Zagadnienia 1. Aplikacja wielookienkowa. Zakładanie projektu typu CLR Windows Forms 1.1. Aplikacja typu MDI 1.2. Aplikacja typu SDI 2. Dziedziczenie

Bardziej szczegółowo

Dziedziczenie & W slajdach są materiały zapożyczone z https://www.ii.uni.wroc.pl/~prz/2012lato/cpp/slajdy/cpp5.

Dziedziczenie & W slajdach są materiały zapożyczone z https://www.ii.uni.wroc.pl/~prz/2012lato/cpp/slajdy/cpp5. Dziedziczenie 27.04.2016 & 04.05.2016 W slajdach są materiały zapożyczone z https://www.ii.uni.wroc.pl/~prz/2012lato/cpp/slajdy/cpp5.ppt class A{ private: int x, y; public: void setvaluex(); void setvaluey();

Bardziej szczegółowo

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.

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. - - uzupełnienie notatek: dr Jerzy Białkowski - - 1-2 - - - 1 #include 2 #include 3 # include 4 using namespace std ; 5 6 class Punkt { 7 8 private : 9 double

Bardziej szczegółowo

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

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta 16.09.2006. Strona 1 z 26. Powrót. Full Screen. Zamknij. Programowanie Sobera Jolanta 16.09.2006 Strona 1 z 26 1 Wprowadzenie do programowania 4 2 Pierwsza aplikacja 5 3 Typy danych 6 4 Operatory 9 Strona 2 z 26 5 Instrukcje sterujące 12 6 Podprogramy 15 7 Tablice

Bardziej szczegółowo

Materiały do zajęć VII

Materiały do zajęć VII Spis treści I. Klasy Materiały do zajęć VII II. III. Konstruktor Właściwości i indeksatory Klasy Programowanie obiektowe wiadomości wstępne Paradygmat programowania obiektowego Abstrakcja Hermetyzacja

Bardziej szczegółowo

Plik klasy. h deklaracje klas

Plik klasy. h deklaracje klas Plik klasy. h deklaracje klas KLASY DLA PRZYKŁADÓW Z POLIMORFIZMEM enum dim r1 = 1, r2, r3; class figura public: static int const maxliczbafigur; = 100; static int liczbafigur; dim rn; rodzaj przestrzeni

Bardziej szczegółowo

Programowanie, część I

Programowanie, część I Programowanie, część I Rafał J. Wysocki Instytut Fizyki Teoretycznej, Wydział Fizyki UW 22 lutego 2011 Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część I 22 lutego 2011 1 / 80 Wstęp Informacje organizacyjne

Bardziej szczegółowo

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU Inicjalizacja agregatowa zmiennej tablicowej int a[5] = 1,2,3,4,5 INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU Struktury są również agregatami, dlatego: struct X double f; char c; X x1 = 1, 2.2, 'c' Ale

Bardziej szczegółowo

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

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016 Wykład 1 3 marca 2016 Słowa kluczowe języka Java abstract, break, case, catch, class, const, continue, default, do, else, enum, extends, final, finally, for, goto, if, implements, import, instanceof, interface,

Bardziej szczegółowo

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

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość 1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość 2. Poprawna definicja wskażnika b to: a) float *a, **b = &a; b) float

Bardziej szczegółowo

Programowanie obiektowe, wykład nr 7. Przegląd typów strukturalnych - klasy i obiekty - c.d.

Programowanie obiektowe, wykład nr 7. Przegląd typów strukturalnych - klasy i obiekty - c.d. Dr hab. inż. Lucyna Leniowska, prof. UR, Zakład Mechatroniki, Automatyki i Optoelektroniki, IT Programowanie obiektowe, wykład nr 7 Przegląd typów strukturalnych - klasy i obiekty - c.d. Klasa - powtórzenie

Bardziej szczegółowo

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji Politechnika Białostocka Wydział Elektryczny Katedra Telekomunikacji i Aparatury Elektronicznej Instrukcja do pracowni specjalistycznej z przedmiotu Obiektowe programowanie aplikacji Kod przedmiotu: TS1C410201

Bardziej szczegółowo

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri); Przeciążanie operatorów [] Przykład: klasa reprezentująca typ tablicowy. Obiekt ma reprezentować tablicę, do której można się odwoływać intuicyjnie, np. Tab[i] Ma być też dostępnych kilka innych metod

Bardziej szczegółowo

Abstrakcyjny typ danych

Abstrakcyjny typ danych Abstrakcyjny typ danych Abstrakcyjny Typ Danych (abstract data type-adt): zbiór wartości wraz z powiązanymi z nimi operacjami; operacje są zdefiniowane w sposób niezależny od implementacji; operacje są

Bardziej szczegółowo

Programowanie obiektowe Wykład 7. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/20

Programowanie obiektowe Wykład 7. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/20 Dariusz Wardowski dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/20 Relacja ma Przykłady relacji typu ma : Student ma nazwisko Wielokąt ma wierzchołki (punkty) Stos ma elementy Dla obiektów

Bardziej szczegółowo

Programowanie Obiektowo Zorientowane w języku C++ Klasy, pola, metody

Programowanie Obiektowo Zorientowane w języku C++ Klasy, pola, metody Programowanie Obiektowo Zorientowane w języku C++ Klasy, pola, metody Mirosław Głowacki 1 1 Akademia Górniczo-Hutnicza im. Stanisława Staszica w Ktrakowie Wydział Inżynierii Metali i Informatyki Stosowanej

Bardziej szczegółowo

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

Programowanie obiektowe w języku C++ Zarządzanie procesami. dr inż. Jarosław Forenc. Przeładowanie (przeciążanie) operatorów Rok akademicki 2016/2017, Wykład nr 5 2/40 Plan wykładu nr 5 Informatyka 2 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr III, studia stacjonarne I stopnia Rok akademicki 2016/2017

Bardziej szczegółowo

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

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej Wykład I - semestr II Kierunek Informatyka Wydział Matematyki Stosowanej Politechniki Śląskiej Gliwice, 2015 c Copyright 2015 Janusz Słupik Zaliczenie przedmiotu Do zaliczenia przedmiotu niezbędne jest

Bardziej szczegółowo

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie Języki i techniki programowania Ćwiczenia 3 Dziedziczenie Klasa abstrakcyjna Autor: Marcin Orchel Klasa abstrakcyjna to taka, że nie możemy tworzyć obiektów tej klasy, możemy jednak dziedziczyć po tej

Bardziej szczegółowo

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM Wykład 13 1 KLASY A ZASŁANIANIE NAZW Nazwy danych składowych i funkcji składowych mają zakres klasy, więc w obrębie klasy zasłaniają takie same nazwy spoza

Bardziej szczegółowo

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { Przeciążanie a dziedziczenie class Integer2: public Integer Operatory, z wyjątkiem operatora przypisania są automatycznie dziedziczone w klasach pochodnych. Integer2(int i): Integer(i) Automatyczne tworzenie

Bardziej szczegółowo

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

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 Programowanie uzupełnienie notatek: dr Jerzy Białkowski 1 2 3 4 Historia C++ został zaprojektowany w 1979 przez Bjarne Stroustrupa jako rozszerzenie języka C o obiektowe mechanizmy abstrakcji danych i

Bardziej szczegółowo

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

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 4. Karol Tarnowski A-1 p. Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni Wykład 4 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Dziedziczenie Przestrzenie nazw Na podstawie: A.

Bardziej szczegółowo

Enkapsulacja, dziedziczenie, polimorfizm

Enkapsulacja, dziedziczenie, polimorfizm 17 grudnia 2008 Spis treści I Enkapsulacja 1 Enkapsulacja 2 Spis treści II Enkapsulacja 3 Czym jest interfejs Jak definuje się interfejs? Rozszerzanie interfejsu Implementacja interfejsu Częściowa implementacja

Bardziej szczegółowo

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

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019 Wykład 3 22 marca 2019 Klasy wewnętrzne Klasa wewnętrzna class A {... class B {... }... } Klasa B jest klasa wewnętrzna w klasie A. Klasa A jest klasa otaczajac a klasy B. Klasy wewnętrzne Właściwości

Bardziej szczegółowo

Podstawy Programowania Obiektowego

Podstawy Programowania Obiektowego Podstawy Programowania Obiektowego Wprowadzenie do programowania obiektowego. Pojęcie struktury i klasy. Spotkanie 03 Dr inż. Dariusz JĘDRZEJCZYK Tematyka wykładu Idea programowania obiektowego Definicja

Bardziej szczegółowo

Typy zmiennych proste i złożone. Programowanie komputerów. Tablica. Złożone typy zmiennych. Klasa. Struktura

Typy zmiennych proste i złożone. Programowanie komputerów. Tablica. Złożone typy zmiennych. Klasa. Struktura Programowanie komputerów Programowanie obiektowe. Typy zmiennych proste i złożone Typy zmiennych "wbudowane", tj. identyfikowane przez słowa kluczowe, są określane jako proste: int short long float double

Bardziej szczegółowo

Programowanie obiektowe i zdarzeniowe

Programowanie obiektowe i zdarzeniowe Marek Tabędzki Programowanie obiektowe i zdarzeniowe 1/23 Programowanie obiektowe i zdarzeniowe wykład 6 polimorfizm Na poprzednim wykładzie: dziedziczenie jest sposobem na utworzenie nowej klasy na podstawie

Bardziej szczegółowo

Technologie i usługi internetowe cz. 2

Technologie i usługi internetowe cz. 2 Technologie i usługi internetowe cz. 2 Katedra Analizy Nieliniowej, WMiI UŁ Łódź, 15 luty 2014 r. 1 Programowanie obiektowe Programowanie obiektowe (z ang. object-oriented programming), to paradygmat programowania,

Bardziej szczegółowo

Programowanie, część I

Programowanie, część I 11 marca 2010 Kontakt Wstęp Informacje organizacyjne Materiał na ćwiczenia Plan wykładu http://www.fuw.edu.pl/~rwys/prog rwys@fuw.edu.pl tel. 22 55 32 263 Materiał na ćwiczenia Informacje organizacyjne

Bardziej szczegółowo

Mechanizm dziedziczenia

Mechanizm dziedziczenia Mechanizm dziedziczenia Programowanie obiektowe jako realizacja koncepcji ponownego wykorzystania kodu Jak przebiega proces dziedziczenia? Weryfikacja formalna poprawności dziedziczenia Realizacja dziedziczenia

Bardziej szczegółowo

Do czego służą klasy?

Do czego służą klasy? KLASY Dorota Pylak 2 Do czego służą klasy? W programowaniu obiektowym posługujemy się obiektami. Obiekty charakteryzują się: cechami (inaczej - atrybutami lub stanami) operacjami, które na nich można wykonywać

Bardziej szczegółowo