Dziedziczenie. Literatura:
|
|
- Ignacy Przybysław Jóźwiak
- 7 lat temu
- Przeglądów:
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 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ółowoDziedziczenie 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ółowoTEMAT : 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ółowoProgramowanie 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ółowoProgramowanie 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ółowoWykł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ółowoDziedziczenie. 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ółowoJę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ółowoIMIĘ 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ółowoProgramowanie 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ółowoProgramowanie 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ółowoJę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ółowoSkł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ółowoZaawansowane 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ółowoProgramowanie 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ółowo1. 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ółowoKurs 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ółowoProgramowanie 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ółowoProgramowanie 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ółowoWstę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ółowoWprowadzenie 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ółowoZaawansowane 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ółowoPodczas 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ółowoKlasa 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ółowoC++ - 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ółowoMechanizm dziedziczenia
Mechanizm dziedziczenia Programowanie obiektowe jako realizacja koncepcji ponownego wykorzystania kodu Jak przebiega proces dziedziczenia? Weryfikacja formalna poprawności dziedziczenia Realizacja dziedziczenia
Bardziej szczegółowoProgramowanie 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ółowoSkł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ółowoJava - 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ółowoPARADYGMATY 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ółowoC++ - 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ółowo2. 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ółowoProgramowanie 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ółowoC++ - [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ółowoSzablony 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ółowoKlasa 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ółowoPARADYGMATY 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ółowoProgramowanie 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ółowoJę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ółowoProgramowanie 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ółowoC++ - 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ółowoWykł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ółowoProgramowanie 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ółowoWstę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ółowoProgramowanie 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ółowoProgramowanie 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ółowoProgramowanie 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 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ółowoInformacje 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ółowoTEMAT : 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ółowodr 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ółowo2.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ółowoWprowadzenie 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ółowoTechniki 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ółowoZaawansowane 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ółowoProgramowanie 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ółowoDziedziczenie. 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ółowoC++ - 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ółowoWykł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ółowoProgramowanie 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ółowoZaawansowane 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ółowoWykł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ółowoJę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ółowoTechniki 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ółowoPolimorfizm, 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ółowoW2 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ółowoKlasy 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ółowoPolimorfizm. 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ółowoWykł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ółowoDziedziczenie & 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ółowoJę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ółowoStrona 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ółowoMateriał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ółowoPlik 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ółowoProgramowanie, 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ółowoC++ - 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ółowoKurs 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ółowo1. 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ółowoProgramowanie 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ółowoInstrukcja 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ółowoAutomatyczne 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ółowoAbstrakcyjny 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ółowoProgramowanie 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ółowoProgramowanie 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ółowoProgramowanie 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ółowoWykł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ółowoJę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ółowoJĘ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ółowoAutomatyczne 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ółowowykł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ółowoTechniki 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ółowoEnkapsulacja, 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ółowoKurs 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ółowoPodstawy 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ółowoTypy 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ółowoProgramowanie 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ółowoTechnologie 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ółowoProgramowanie, 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ółowoMechanizm dziedziczenia
Mechanizm dziedziczenia Programowanie obiektowe jako realizacja koncepcji ponownego wykorzystania kodu Jak przebiega proces dziedziczenia? Weryfikacja formalna poprawności dziedziczenia Realizacja dziedziczenia
Bardziej szczegółowoDo 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