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

Hasonló dokumentumok
Java VII. Polimorfizmus a Java nyelvben

Java VII. Polimorfizmus a Java nyelvben

Származtatási mechanizmus a C++ nyelvben

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

Objektumok inicializálása

C++ programozási nyelv

Osztály és objektum fogalma

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

A C++ szigorúbban kezeli a típuseltéréseket, mint a C nyelv Lehetséges típuskonverziók:

Programozási nyelvek Java

Java III. I I. Osztálydefiníció (Bevezetés)

Java III. I I. Osztálydefiníció (Bevezetés)

Osztálytervezés és C++ implementációs ajánlások I.

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

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

Programozás II. 4. Dr. Iványi Péter

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

Java VI. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. Java VI.: Öröklődés JAVA6 / 1

Kivételkezelés a C++ nyelvben Bevezetés

3. Osztályok II. Programozás II

Programozás II gyakorlat. 6. Polimorfizmus

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

Programozási nyelvek Java

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.

Osztályok. 4. gyakorlat

C++ programozási nyelv Konstruktorok-destruktorok

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

és az instanceof operátor

Az alábbi példában a Foo f(5); konstruktor hívása után mennyi lesz f.b értéke? struct Foo { int a, b; Foo(int c):a(c*2),b(c*3) {} };

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

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.

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

Bevezetés a C++ programozási nyelvbe

1) Hány byte-on tárol a C++ egy karaktert (char)? implementáció-függő ( viszont lásd 79. megjegyzés ) 1 8 4

Objektumorientált programozás C# nyelven

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

Objektumorientált programozás C# nyelven

OOP alapok Egy OOP nyelvet három fontos dolog jellemez. egységbezárás ( encapsulation objektumoknak öröklés ( inheritance

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

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

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

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Bevezetés a Python programozási nyelvbe

JAVA PROGRAMOZÁS 2.ELŐADÁS

Interfészek. PPT 2007/2008 tavasz.

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

Öröklés és Polimorfizmus

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

Alkalmazott modul: Programozás 11. előadás. Objektumorientált programozás: öröklődés

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

500. AA Megoldó Alfréd AA 500.

Miután létrehoztuk, szeretnénk neki beszédesebb nevet adni. A név változtatásához a következőt kell tenni:

Programozás II. 6.Öröklés Dr. Iványi Péter

Már megismert fogalmak áttekintése

OOP #14 (referencia-elv)

Kivételek, kivételkezelés a C++ nyelvben

C# osztálydeníció. Krizsán Zoltán 1. .net C# technológiák tananyag objektum orientált programozás tananyag

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ó

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

OOP. Alapelvek Elek Tibor

Programozás módszertan p.1/46

Programozás II gyakorlat. 8. Operátor túlterhelés

Osztály öröklődés. Öröklődés és polimorfizmus. Programozás II. előadás. Szénási Sándor.

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

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

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

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

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

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

Pénzügyi algoritmusok

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

C++ programozási nyelv Struktúrák a C++ nyelvben

Programozás C és C++ -ban

Programozási nyelvek II.: JAVA, 3. gyakorlat

Java II. I A Java programozási nyelv alapelemei

Szoftvertechnológia 4. előadás. Objektumorientált tervezés: általánosítás. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

A C programozási nyelv III. Pointerek és tömbök.

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

Bevezetés, a C++ osztályok. Pere László

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

A C programozási nyelv III. Pointerek és tömbök.

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

Az OO paradigma. Mitől OO egy program? Objektum Osztály Öröklődés

STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

0.2.1 Operátorok túlterhelése (műveletek definiálhatók felhaszn. típusokra) Kutya. Eb1. Eb2. Név (txt): Rex. Blöki. Német juhász 3

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?

Informatikai Kar. 4. fejezet. Giachetta Roberto

Programozási nyelvek II.: JAVA, 11. gyakorlat

Java IX. telkezelés a Java-ban

Objektumorientált szoftverfejlesztés alapjai

Java IX. telkezelés a Java-ban

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

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

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

TestLine - OO Programozás alapjai Minta feladatsor

Az OO paradigma. Mitől OO egy program? Objektum Osztály Öröklődés

Concurrency in Swing

Átírás:

Virtuális függvények (late binding) Miskolci Egyetem Általános Informatikai Tanszék Virtuális függvények CPP5 / 1 Azonos nevű függvények megkülönböztetése paraméterszignatúra (függvény overloading) - egy hatáskörön belül SCOPE operátor segítségével (classname::fname) mezőkiválasztó operátor (objname.fname) Ez a megkülönböztetés fordítási időben megtörténik. Származtatás: gond lehet az azonos nevű függvényekkel. Megoldás: late binding (késői kötés) Nyelvi eszköz: virtuális függvény Virtuális függvények CPP5 / 2 CPPEX12.C class jarmu protected: int kerekek; double suly; public: jarmu (int k, double s) kerekek = k; suly = s;} void hanykerek (void) cout << "A jarmu kerekeinek szama: " << kerekek << "\n";} Virtuális függvények CPP5 / 3

CPPEX12.C (folyt.) class gepkocsi : public jarmu protected: int szemelyek; public: gepkocsi (int k, double s, int szem) : jarmu (k, s) szemelyek = szem; } void hanykerek (void) cout << "A gepkocsi kerekeinek szama: " << kerekek << "\n";} Virtuális függvények CPP5 / 4 CPPEX12.C (folyt.) main () jarmu bicikli (2,15); bicikli.hanykerek(); gepkocsi trabant (4, 120.0, 4); trabant.hanykerek(); } // Az eremeny: // A jarmu kerekeinek szama: 2 // A gepkocsi kerekeinek szama: 4 Virtuális függvények CPP5 / 5 CPPEX12.C - tanulságok A tagfüggvény meghívása objektumhoz kapcsolva az objektum osztálya határozza meg a hatáskört, amelyben a függvény definíciót keresni kell a fordítóprogram azonosítani tudja a függvényt a megfelelő függvény hívódik meg Virtuális függvények CPP5 / 6

CPPEX13.C main ()// A CPPEX12 osztalydefiniciojaval jarmu *kerekes; kerekes = new jarmu (2,15.); kerekes->hanykerek(); kerekes = new gepkocsi (4, 120.0, 4); kerekes->hanykerek(); } // Az eredmeny: // A jarmu kerekeinek szama: 2 // A jarmu kerekeinek szama: 4 Virtuális függvények CPP5 / 7 CPPEX13.C - tanulságok A tagfüggvény meghívása objektumra mutató pointer segítségével a pointer alaptípusa határozza meg az osztályt, amelynek hatáskörében a függvény definíciót keresni kell a fordítóprogram azonosítani tudja a függvényt nem a megfelelő függvény hívódik meg, ha a pointer alaptípusa és az általa megcímzett objektum típusa eltér Virtuális függvények CPP5 / 8 Virtuális függvény: formai szabályok Csak tagfüggvény definiálható virtuálisnak, az osztálydeklaráció törzsében elhelyezett virtual alapszóval. Az öröklődési hierarchiában lejjebb álló osztályok tartalmazhatnak ugyanilyen nevű, paraméter szignatúrájú és visszatérési értékű tagfügvényeket. Ezek a függvények a virtual alapszó nélkül is virtuálisnak minősülnek. Virtuális függvények CPP5 / 9

Formai szabályok (folyt.) A virtuális függvényt a bázisosztályban kötelező definiálni, a leszármazottak mindegyikében nem. A bázisosztályban a virtuális függvény lehet valódi virtuális függvény - ekkor 0-val kell inicializálni. Például: virtual void hanykerek () = 0; Az ilyen osztály nem példányosítható (absztrakt osztály). Virtuális függvények CPP5 / 10 Formai szabályok (folyt.) Ha mutatón keresztül hívjuk meg a virtuális függvényt, nem a mutató alaptípusa határozza meg, hogy melyik változatot kell használni, hanem a megcímzett objektum típusa. A megcímzett objektum típusa általában csak futási időben derül ki A fordítóprogram általában nem tudja megkeresni a meghívandó függvényt, csak előkészíteni a futásidejű kiválasztását. Virtuális függvények CPP5 / 11 Virtuális függvény használata Használata: ugyanolyan funkciók a leszármazott osztályokban a funkció implementációja osztályfüggő Virtuális függvények CPP5 / 12

Virtuális függvény korai kötéssel Az alábbi esetekben a virtuális függvény hívását is fel tudja dolgozni a fordítóprogram fordítási időben (korai kötés): Objektum hivatkozáson keresztül hívjuk meg. SCOPE operátorral explicite meghatározzuk a definíció helyét. A bázisosztály konstruktorában vagy destruktorában hívjuk meg. Virtuális függvények CPP5 / 13 CPPEX14.C class jarmu protected: int kerekek; double suly; public: jarmu (int k, double s) kerekek = k; suly = s;} virtual void hanykerek (void) cout << "A jarmu kerekeinek szama: " << kerekek << "\n";} Virtuális függvények CPP5 / 14 CPPEX14.C (folytatás) class gepkocsi : public jarmu protected: int szemelyek; public: gepkocsi (int k, double s, int szem) : jarmu (k, s) szemelyek = szem; } void hanykerek (void) cout << "A gepkocsi kerekeinek szama: " << kerekek << "\n";} Virtuális függvények CPP5 / 15

CPPEX14.C (folytatás) main () jarmu *kerekes; kerekes = new jarmu (2,15.); kerekes->hanykerek(); kerekes = new gepkocsi (4, 120.0, 4); kerekes->hanykerek(); } // Az eredmeny: // A jarmu kerekeinek szama: 2 // A gepkocsi kerekeinek szama: 4 Virtuális függvények CPP5 / 16 Példa: grafikus elemek, 1. verzió Location X : Integer Y : Integer GetX() : Integer GetY() : Integer Point Visible : Boolean MoveTo(NewX : Integer, NewY : Integer) IsVisible() : Boolean Circle Radius : Integer MoveTo(NewX : Integer, NewY : Integer) Expand(Ratio : Single) Square Ellipse Radius1 : Integer MoveTo(NewX : Integer, NewY : Integer) Expand(Ratio : Single) Virtuális függvények MoveTo(NewX : Integer, NewY : Integer) CPP5 / 17 Példa: grafikus elemek 1. verzió (folyt.) Implementációk: void Point::MoveTo(int NewX, int NewY) ; // aktuális törlése X = NewX; // új pozíció Y = NewY; ; // megjelenítés az új helyen void Circle::MoveTo(int NewX, int NewY) ; // aktuális törlése X = NewX; // új pozíció Y = NewY; ; // megjelenítés az új helyen Virtuális függvények CPP5 / 18

Példa: grafikus elemek 1. verz.. (folyt.) A két implementáció azonosnak tűnik, mert azonos az algoritmus. A különbség: a Point::MoveTo-ban a Point:: hívódik meg a Circle::MoveTo-ban a Circle:: hívódik meg Ezért nem örökölhető a MoveTo (azaz külön implementáció szükséges minden osztályra)! Virtuális függvények CPP5 / 19 Példa: grafikus elemek 2. verzió Location X : Integer Y : Integer GetX() : Integer GetY() : Integer Visible : Boolean Point <<virtual>> <<virtual>> MoveTo(NewX : Integer, NewY : Integer) IsVisible() : Boolean Circle Radius : Integer Expand(Ratio : Single) Square Ellipse Radius1 : Integer Virtuális függvények CPP5 / 20 Expand(Ratio : Single) Példa: grafikus elemek 2. verzió (folyt.) Különbségek: a Show és Hide függvények virtuálisak a MoveTo függvény öröklődik Eredmény: a MoveTo függvény a this->show és this->hide függvényeket hívja meg a this mutató által megcímzett objektum típusa (amellyel a MoveTo-t használtuk) dönt az objektum aktuális típusa csak futásidőben dől el Virtuális függvények CPP5 / 21

Példa a használatra const int MAXELEM=100; Location* elemek[maxelem]; int aktelemszam=0; // Uj rajzelem letrehozasa aktelemszam++; elemek[aktelemszam] = new Virtuális függvények CPP5 / 22 Példa a használatra (folyt.) // Osszes elem ujra rajzolasa for (int i=0; i<aktelemszam; i++) elemek[i] -> ; Virtuális függvények CPP5 / 23