Programozás alapjai II. (5. ea) C++

Hasonló dokumentumok
Programozás alapjai II. (5. ea) C++

Programozás alapjai II. (4. ea) C++

Programozás alapjai II. (4. ea) C++

Programozás alapjai II. (4. ea) C++

Programozás alapjai II. (4. ea) C++

Programozás alapjai II. (5. ea) C++ Objektummodell, öröklés, virtuális tagfüggvény

Programozás alapjai II. (5. ea) C++ Objektummodell, öröklés, virtuális tagfüggvény

OOP. Alapelvek Elek Tibor

osztályok kapcsolata Származtatatás C++ Izsó Tamás március 19. Izsó Tamás Származtatatás/ 1

Programozás II gyakorlat. 6. Polimorfizmus

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

C++ programozási nyelv

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

Bevezetés a programozásba előadás: Öröklődés

Objektumorientált programozás C# nyelven

Programozás alapjai II. (6. ea) C++

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

Programozási nyelvek Java

Programozás módszertan p.1/46

Objektumorientált paradigma és programfejlesztés Bevezető

500. AA Megoldó Alfréd AA 500.

Felhasználó által definiált adattípus

ISA szimulátor objektum-orientált modell (C++)

Programozási nyelvek Java

és az instanceof operátor

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Java programozási nyelv 5. rész Osztályok III.

Visual C++ osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés.

Virtuális függvények (late binding)

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Programozás. Bevezetés. Fodor Attila. Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék

Programozás. C++ osztályok. Fodor Attila. Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék

Objektumelvű programozás

Objektum orientált programozás Bevezetés

Programozás alapjai II. (6. ea) C++

Programozás alapjai II. (6. ea) C++

Absztrakció. Objektum orientált programozás Bevezetés. Általános Informatikai Tanszék Utolsó módosítás:

Bevezetés a Python programozási nyelvbe

Osztálytervezés és implementációs ajánlások

Osztálytervezés és implementációs ajánlások

Objektumorientált paradigma és a programfejlesztés

Objektumorientált programozás C# nyelven

BME MOGI Gépészeti informatika 8.

Programozási alapismeretek 4.

ANALYSIS PATTERNS MARTIN FOWLER ANALYSIS PATTERNS. Általános ismertető és Accountability Patterns

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Programozási technológia

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

Objektumelvű alkalmazások fejlesztése 6. gyakorlat. Öröklődés, polimorfizmus. Öröklődés Kódismétlődés objektum-orientált szerkezetben

Bevezetés a programozásba Előadás: A const

Java VII. Polimorfizmus a Java nyelvben

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

Programozás alapjai II. (5. ea) C++

OOP: Java 8.Gy: Abstract osztályok, interfészek

Programozási nyelvek Java

Interfészek. PPT 2007/2008 tavasz.

Programozás. Objektum Orientált Programozás (OOP) Alapfogalmak. Fodor Attila

Alkalmazott Modul III 6. előadás. Objektumorientált programozás: öröklődés és polimorfizmus

Java és web programozás

Pénzügyi algoritmusok

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Osztályok. 4. gyakorlat

Programozás I. 5. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

1. Öröklés Rétegelés Nyilvános öröklés - isa reláció Korlátozó öröklődés - has-a reláció

Bevezetés a Programozásba II 8. előadás. Polimorfizmus Giachetta Roberto

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 2.ELŐADÁS. Objektumorientált programozás

Bevezetés a programozásba II. 8. Előadás: Osztályok, objektumok, osztályszintű metódusok

Java VII. Polimorfizmus a Java nyelvben

Programozási technológia

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

Objektum Orientált Szoftverfejlesztés (jegyzet)

Számítógép és programozás 2

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

Elemi Alkalmazások Fejlesztése II.

ELTE SAP Excellence Center Oktatóanyag 1

JAVA PROGRAMOZÁS 2.ELŐADÁS

1. Bevezetés A C++ nem objektumorientált újdonságai 3

Abstract osztályok és interface-ek. 7-dik gyakorlat

Már megismert fogalmak áttekintése

C++ programozási nyelv

Objektumok inicializálása

Bánsághi Anna 2014 Bánsághi Anna 1 of 31

1.AA MEGOLDÓ BERCI AA 1.

Öröklés és Polimorfizmus

Programozás II gyakorlat. 4. Öröklődés

500. CC Megoldó Alfréd CC 500.

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Programozás III KIINDULÁS. Különböző sportoló típusok vannak: futó, magasugró, focista, akik teljesítményét más-más módon határozzuk meg.

Osztály és objektum fogalma

Java programozási nyelv 4. rész Osztályok II.

Programfejlesztési Modellek

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

10-es Kurzus. OMT modellek és diagramok OMT metodológia. OMT (Object Modelling Technique)

Bevezetés a programozásba Előadás: Tagfüggvények, osztály, objektum

Objektumorientáció, objektumorientált szemlélet

OOP #1 (Bevezetés) v :39:00. Eszterházy Károly Főiskola Információtechnológia tsz. Hernyák Zoltán adj.

OOP #14 (referencia-elv)

Átírás:

Programozás alapjai II. (5. ea) C++ analitikus és korlátozó öröklés Szeberényi Imre BME IIT <szebi@iit.bme.hu> M Ű E G Y T E M 1 7 8 2 C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. -1 - OO modellezés fogalmai újból Objektum adat (állapot) és a rajta végezhető művelet a világ egy részének egy olyan modellje, amely külső üzenetekre reagálva valahogyan viselkedik (változtatja az állapotát, újabb üzenetet küld) üzenetekre (message), vagy eseményekre (event) a metódus végrehajtásával reagál, viselkedik (behavior) polimorf működés C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. -2- OO modellezés fogalmai újból/2 Osztály és példány jelölése Objektum osztály, osztály (class) megegyező viselkedésű és struktúrájú objektumok mintája, gyártási forrása. (pl, ház, ablak, kutya) Objektum példány, objektum (instance) Minden objektum önállóan, létező egyed (Blöki, Morzsi, Bikfic) Kutya Kutya : string fajta: string kor: int (Kutya) Blöki (Kutya) Blöki korcs 2 (Kutya) (Kutya) Morzsi puli 3 C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. -3- C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. -4- Osztály és típus int i; i nevű objektum aminek a mintája int Nem teljesen azonos, mert a típus egy objektum-halmaz viselkedését specifikálja. Az osztály a típus által meghatározott viselkedést implementálja. Egy adott objektumtípust többféleképpen lehet implementálni, (több osztállyal). Osztály és típus/2 Példaként vegyünk egy olyan komplex objektumot, amiben valós és képzetes résszel tárolunk, és vegyünk egy másikat polárkoordinátákkal. A kétfajta komplex megvalósítás osztály szinten különböző, de típusuk viselkedésük interfész szinten azonos. Hagyományos nyelveken a típus értékhalmazt jelöl. C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. -5- C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. -6-

Modellezés objektumokkal Különböző szempontok szerint modellezünk. Objektummodell Adat szempontjából írja le a rendszer statikus tulajdonságait (osztály v. entitás-relációs diagram). Dinamikus modell A működés időbeliségét rögzíti (állapotgráf, kommunikációs diagram). Funkcionális modell Funkció szerint ír le (adatfolyam-ábra). Modellezés eszközei, módszertana Részletesen szoftvertechnológiája c. tárgyban a következő félévben. Itt csak minimális alapok a nyelvi eszközök megismeréséhez. C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. -7- C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. -8- Objektummodell Attribútumok leírása Elnevezés típusú attribútumok. Nem vagy ritkán változnak (, személyi szám, nem) Leíró attribútumok. Referenciák. Kimutatnak az objektumból. Kapcsolatok (relációk) leírása láncolás objektum példányok között asszociáció osztályok közötti kapcsolat Öröklés leírása Példák a kapcsolatok leírására Ember cím gazda 0..1 * Kutya fajta kor Egy ember 0 vagy több kutyának lehet gazdája. Egy kutyának legfeljebb egy gazdája van, de lehet, hogy gazdátlan. C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. -9- C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 10 - Egy több kapcsolat Kapcsolatok attribútumai Anya cím szült 1..* Gyerek nem Hallgató cím Tárgy vizsgázik 1..* 1..* előadó hely vizsgajegy Egy anya legalább egy gyereket szült (1..*). Egy gyereket pontosan egy anya szült. Egy tárgyból többen is vizsgázhatnak. Egy hallgató több tárgyból is vizsgázhat. A vizsga eredménye (attribútuma) a vizsgajegy. C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 11 - C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 12 -

Komponens reláció Levél * Bekezdés * Karakter A karakter része a bekezdésnek, a bekezdés része a levélnek. Elnevezés: szülő gyerek viszony, de nem keverendő össze az örökléssel! Öröklés Az öröklés olyan implementációs és modellezési eszköz, amelyik lehetővé teszi, hogy egy osztályból olyan újabb osztályokat származtassunk, melyek rendelkeznek az eredeti osztályban már definiált tulajdonságokkal, szerkezettel és viselkedéssel. Újrafelhasználhatóság szinonimája. Nem csak bővíthető, hanem a tagfüggvények át is definiálhatók. C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 13 - C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 14 - Feladat Diákokból, tanárokból álló rendszert szeretnénk modellezni. Diák attribútumai:,, átlag, évfolyam Tanár attribútumai:,, tantárgy, fizetés Milyen osztályokat hozzunk létre? 2 független osztály?, 2x, műveletek 2x, nehezen módosítható alaposztály specializáció az egy Diák +átlag +évf. Örökléssel Ember általánosítás az egy Tanár +tantárgy +fizetés származtatott osztályok C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 15 - C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 16 - Öröklés másként jelölve C++ jelölés Diák +átlag +évf. Ember Tanár +tantárgy +fizetés class Ember { String *nev; Date szido; Ember(); void setdate(date d); void setname(char *n); const char *getname();... C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 17 - C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 18 -

C++ jelölés/2 class Diak :public Ember { double atlag; Diak(); void setav(double a);... class Tanar :public Ember { double fizetes; Tanar();... Alaposztályból minden látszik ami publikus +Új attribútum +Új tagfüggvény Öröklés előnyei Hasonlóság kiaknázása Világosabb programstruktúra Módosíthatóság mellékhatások nélkül Újabb tulajdonságok hozzáadása Kiterjeszthetőség Újrafelhasználható C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 19 - C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 20 - Öröklés fajtái Analitikus és korlátozó öröklés I. Analitikus Korlátozó Alakzat poz, szin mozgat() analitikus öröklés II. Egyszerű Többszörös Vonal +végpont Kör +sugár Téglalap +csúcs Négyzet korlátozó öröklés C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 21 - C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 22 - Csoportvez. csoport Többszörös öröklés Alkalmazott, fizetés Ideigl.csopvez. Ideigl. alk. idő Kompatibilitás és öröklés A típusú objektum kompatibils B-vel, ha A típusú objektum bárhol és bármikor alkalmazható, ahol B használata megengedett. A reláció reflektív és tranzitív, de nem szimmetrikus. A kompatibilitás egy hierarchiát szab meg pl: állat <-komp.- madár <-komp.- veréb C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 23 - C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 24 -

Kompatibilitás/2 Geometria alakzatok C++ban specializáció (altípus) állat általánosítás (szupertípus) Alakzat poz, szin mozgat() analitikus öröklés madár emlős vízi galamb veréb kutya bálna ponty Vonal +végpont Kör +sugár Téglalap +csúcs Négyzet korlátozó öröklés C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 25 - C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 26 - Alakzat alaposztály class Alakzat { protected: Védelem enyhítése a int x, y; leszármazottak felé int szin; Alakzat(int x0, int y0, int sz) :x(x0), y(y0), szin(sz) { // mozgat(), érezzük, hogy itt a helye, de nem // tudjuk hogyan kell rajzolni! // Ezért próbáljuk a származtatottba tenni, ahol // már ismert a rajzolás menete. Vonal osztály class Vonal : public Alakzat { int xv, yv; Vonal(int x1, int y1, int x2, int y2, int sz) Alaposztályból minden látszik ami publikus : Alakzat(x1, y1, sz), xv(x2), yv(y2) { void rajzol( ); C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 27 - C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 28 - void Vonal :: Rajzol( ) {... // vonalat rajzol Vonal tagfüggvényei void Vonal :: Mozgat( int dx, int dy ) { int sz = szin; // tényleges rajzolási szín elmentése szin = BACKGRD;// rajzolási szín legyen a háttér színe rajzol( ); // A vonal letörlése az eredeti helyről x += dx; y += dy; // mozgatás: a pozíció változik szin = sz; // rajzolási szín a tényleges szín rajzol( ); // A vonal felrajzolása az új pozícióra Téglalap osztály class Teglalap : public Alakzat { int xc, yc; Teglalap(int x1, int y1, int x2, int y2, int sz) : Alakzat(x1, y1, sz), xc(x2), yc(y2) { void rajzol( ); Ugyanaz, mint a vonalnál, csak a hívott rajzol() más C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 29 - C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 30 -

mozgat() helye Származtatott osztályokban látszólag ugyanaz a függvény minden alakzatban csak az általa hívott rajzol() más Alaposztályban ha a hívott rajzol()-t egy manó le tudná cserélni mindig a megfelelő származtatott rajzol()-ra, akkor működne virtuális függvény C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 31 - Alakzat osztály virtuális függvénnyel class Alakzat { protected: Az öröklés során újabb jelentést kaphat, ami az int x, y; alaposztályból is elérhető, int szin; így a mozgat()-ból is. Alakzat(int x0, int y0, int sz) :x(x0), y(y0), szin(sz) { virtual void rajzol( ) { Most már ide tehetjük, mert a rajzol() is itt van. C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 32 - Alakzat mozgat() tagfüggvénye void Alakzat :: Mozgat( int dx, int dy ) { int sz = szin; // tényleges rajzolási szín elmentése szin = BACKGRD;// rajzolási szín legyen a háttér színe rajzol( ); // A vonal letörlés az eredeti helyről x += dx; y += dy; // mozgatás: a pozíció változik szin = sz; // rajzolási szín a tényleges szín rajzol( ); // A vonal felrajzolása az új pozícióra C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 33 - Vonal osztály újra class Vonal : public Alakzat { int xv, yv; Vonal(int x1, int y1, int x2, int y2, int sz) : Alakzat(x1, y1, sz), xv(x2), yv(y2) { void rajzol( ); // átdefiniáljuk a virt. fv-t. void Vonal::rajzol( ) {... // vonalat rajzol. // Az alaposztályból hívva is ez hívódik C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 34 - Téglalap osztály újra class Teglalap : public Alakzat { int xc, yc; Teglalap(int x1, int y1, int x2, int y2, int sz) : Alakzat(x1, y1, sz), xc(x2), yc(y2) { void rajzol( ); // átdefiniáljuk a virt. fv-t. void Teglalap::rajzol( ) {... // téglalapot rajzol. // Az alaposztályból hívva is ez hívódik C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 35 - Mintaprogram main ( ) { Teglalap tegla(1, 10, 2, 40, RED); // téglalap Vonal vonal(3, 6, 80, 40, BLUE); // vonal Alakzat alak(3, 4, GREEN); //??? alak.mozgat(3, 4); // 2 db rajzol() hívás vonal.rajzol( ); // 1 db rajzol() vonal.mozgat(10, 10); // 2 db rajzol() hívás Alakzat *ap[10]; ap[0] = &vonal; // nem kell típuskonverzió ap[1] = &tegla; for (int i = 0; i < 2; i++ ) ap[i] ->rajzol(); C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 36 -

Mikor melyik rajzol()? Virtuális Alakzat:: rajzol() Nem virtualis Alakzat:: rajzol() alak.mozgat() Alakzat::rajzol() Alakzat::rajzol() vonal.rajzol() Vonal::rajzol() Vonal::rajzol() vonal.mozgat Vonal::rajzol() Alakzat::rajzol() sp[0]->rajzol() Vonal::rajzol() Alakzat::rajzol() Vonal-ra mutat sp[1]->rajzol() Teglalap-ra mutat Teglalap::rajzol() Alakzat::rajzol() Alakzat önállóan? Alakzat alak(3, 4, GREEN); //??? alak.mozgat(3, 4); // Mit rajzol?? Nem értelmes példányosítani, de lehet, mivel osztály. Nyelvi eszközzel tiltjuk: Absztrakt alaposztály C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 37 - C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 38 - Absztrakt alaposztályok Csak az öröklési hierarchia kialakításában vesznek részt, nem példányosodnak A virtuális függvényeknek nincs értelmes törzse: tisztán (pure) virtuális függvény class Alakzat { protected: int x, y, szin; Nem példányosítható Alakzat( int x0, int y0, int sz) ; void mozgat( int dx, int dy ); virtual void rajzol( ) = 0; // tisztán virtuális C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 39 - Öröklés impl., ha nincs virtuális fv. C++ osztályok Alakzat x, y, szín mozgat( ) Vonal xv, yv rajzol( ) Új rész C struktúrák struct Alakzat struct Vonal x x y y szín szín xv yv C globális függvények AlakzatMozgat( ) VonalRajzol( ) AlakzatKonstr( ) VonalKonstr( ) C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 40 - Öröklés impl., ha a Rajzol() virtuális Alakzat C implementációja C++ osztályok Alakzat x, y, szín rajzol( ) Vonal xv, yv rajzol( ) C struktúrák struct Alakzat struct Vonal x x y y szín szín &rajzol() &rajzol() xv yv C globális függvények AlakzatRajzol( ) VonalRajzol( ) AlakzatKonstr( ) VonalKonstr( ) C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 41 - struct Alakzat { int x, y, szín; void (*Rajzol)( ); void AlakzatMozgat( struct Alakzat *this ) { AlakzatKonstr(struct Alakzat *this, int x0, int y0, int sz) { this->rajzol = AlakzatRajzol; // fordító!!! this->x = x0; this->y = y0; this->szin = sz; C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 42 -

Alakzat C implementációja/2 void AlakzatMozgat(struct Alakzat *this, int dx, int dy ) { int sz = this->szin; this->szin = BACKGRD; (*(this->rajzol))(this); this->x += dx; this->y += dy; this->szin = sz; (*(this ->rajzol))(this); Téglalap osztály újra class Teglalap : public Alakzat { int xc, yc; Teglalap(int x1, int y1, int x2, int y2, int sz) : Alakzat(x1, y1, sz), xc(x2), yc(y2) { void ujmeret(int x2, int y2) { xc = x + x2; yc = y + y2; void rajzol( ); // mozgat() az alaposztályban C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 43 - C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 44 - Négyzet osztály (korlátoz) class Negyzet : private Teglalap { Eltakarja az alaposztályt Negyzet(int x1, int y1, int s, int sz) : Teglalap(x1, y1, x1+s, y1+s, sz) { void rajzol( ) { Teglalap::rajzol(); void mozgat(int dx, int dy) { Teglalap::mozgat(dx, dy); Az ujmeret() fv-t így kívülről elérhetetlenné tettük (korlátoztuk az elérését) C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 45 - Összefoglalás Objektummodell Attribútumok Kapcsolatok (relációk) Öröklés (specializáció általánosítás) analitikus v. korlátozó egyszerű v. többszörös C++ nyelvi eszköz: analitikus public, korlátozó private tagfüggvények átdefiniálása, protected mezők virtuális tagfüggvény: alaposztály felőlelérhető a származtatott osztály tagfüggvénye, absztrakt alaposztály nem példányosítható C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 46 - Védelem összefoglalása külső származtatott tagfüggvény és barát protected: private: C++ programozási nyelv BME-IIT Sz.I. 2011.03.8. - 47 -