C++ programozási nyelv



Hasonló dokumentumok
C++ programozási nyelv

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

Objektumorientált programozás C# nyelven

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

C++ programozási nyelv

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

Programozás II gyakorlat. 6. Polimorfizmus

C++ programozási nyelv Konstruktorok-destruktorok

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

Már megismert fogalmak áttekintése

é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 VII. Polimorfizmus a Java nyelvben

Java VII. Polimorfizmus a Java nyelvben

Interfészek. PPT 2007/2008 tavasz.

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

Bevezetés a Python programozási nyelvbe

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.

OOP #14 (referencia-elv)

Objektumorientált programozás C# nyelven

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

Programozás módszertan p.1/46

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

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

OOP. Alapelvek Elek Tibor

Java programozási nyelv 6. rész Java a gyakorlatban

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

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

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ási nyelvek Java

Programozási alapismeretek 4.

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

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

3. Osztályok II. Programozás II

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 Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

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

C++ referencia. Izsó Tamás február 17. A C++ nyelvben nagyon sok félreértés van a referenciával kapcsolatban. A Legyakoribb hibák:

Öröklés és Polimorfizmus

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

Interfészek. Programozás II. előadás. Szénási Sándor.

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

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

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

JAVA PROGRAMOZÁS 2.ELŐADÁS

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

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

C++ programozási nyelv Konstruktorok Gyakorlat

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 BMEKOKAA146. Dr. Bécsi Tamás 5. előadás

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?

Objektumok inicializálása

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

Programozási nyelvek Java

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

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

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

Java programozási nyelv

Java és web programozás

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

Objektumorientált szoftverfejlesztés alapjai

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

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

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

C programozási nyelv Pointerek, tömbök, pointer aritmetika

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

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

A függvények névvel rendelkező utasításcsoportok, melyeknek információkat adhatunk át, és van egy visszatérési értékük.

Programozási nyelvek Java

8. gyakorlat Pointerek, dinamikus memóriakezelés

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

Osztályok. 4. gyakorlat

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

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

Bevezetés a C++ programozási nyelvbe

Swedish store (C#) Óbudai Egyetem, Programozás 2 Mérnök Informatikus szak, BSc Labor. Bedők Dávid v0.1

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

Objektumorientált programozás C# nyelven II.

Objektum orientált programozás Bevezetés

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

Programozás C++ -ban 2007/7

Clang Static Analyzer belülről

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

Java programozási nyelv 9. rész Kivételkezelés

Objektum orientált kiterjesztés A+ programozási nyelvhez

JAVA PROGRAMOZÁS 3.ELŐADÁS

III. OOP (objektumok, osztályok)

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

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

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

Globális operátor overloading

Java II. I A Java programozási nyelv alapelemei

Programozás alapjai. 10. előadás

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

Java és web programozás

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

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Függvények. Dr. Bécsi Tamás 6. Előadás

Alprogramok, paraméterátadás

Java II. I A Java programozási nyelv alapelemei

Mutatók és mutató-aritmetika C-ben március 19.

Átírás:

C++ programozási nyelv Gyakorlat - 8. hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet Soós Sándor 2004. november A C++ programozási nyelv Soós Sándor 1/12

Tartalomjegyzék Miért örököltetünk osztályokat? 1. példa A virtual kulcsszó 2. példa Polimorfizmus, többalakúság Early binding, late binding Binding példa Miért jó a polimorfizmus? Pure virtual, tisztán virtuális metódusok Mire jók az absztrakt osztályok? A C++ programozási nyelv Soós Sándor 2/12

Miért örököltetünk osztályokat? 1. eset: Gyerek = szülő + valami a gyerek mindent tud, amit a szülő + tud még mást is ezzel az esettel foglalkoztunk a múlt héten 2. eset Gyerek = szülő, másképp a gyerek ugyanazokat a dolgokat tudja, mint a szülő, de másképp ezzel foglalkozunk ma! A gyakorlatban a két dolog együtt zajlik. Általában egy gyerek egyrészt kiterjeszti a szülőjét újabb funkciókkal, másrészt egyes örökölt tulajdonságokat (metódusokat) módosít (felüldefiniál). A C++ programozási nyelv Soós Sándor 3/12

1. példa class Szemely { public: virtual void Koszon(); }; void Szemely::Koszon() { printf("jó napot!\n"); }; class Diak : public Szemely { public: virtual void Koszon(); }; void Diak::Koszon() { printf("jó szerencsét!\n"); }; int main() { Szemely sz; Diak d; sz.koszon(); d.koszon(); return 0; }; // Jó napot! // Jó szerencsét! Ebben az esetben nem történt semmi váratlan. Ha most elhagynám a virtual kulcsszót, ugyanez lenne az eredmény. A C++ programozási nyelv Soós Sándor 4/12

A virtual kulcsszó Két helyen írtuk le a virtual kulcsszót: a szülőben a gyerekben Mindkét helyen csak a deklarációban, a definícióban nem szabad kiírni! Ha most elhagynám, akkor ez a példa változatlanul működne, de nem célszerű elhagyni! Amikor egy függvényt felül fogunk definiálni az utódokban, akkor használjuk a virtual-t a szülő osztályban! Erre később még visszatérünk! A gyerek osztályban mindegy, hogy kiírjuk-e, de érdemes kiírni dokumentációs szempontból, a program működését nem befolyásolja. A C++ programozási nyelv Soós Sándor 5/12

2. példa void Diak::Koszon() { Szemely::Koszon(); printf("jó szerencsét!\n"); }; int main() { Diak d; d.koszon(); return 0; }; // Jó napot! // Jó szerencsét! A leszármazott egy felüldefiniált metódusban meghívhatja az ősének ugyanilyen nevű metódusát Mi történik, ha a Diak::Koszon-ben kihagyom a Szemely:: -t? Ezt is leírhatom a main-ben: d.szemely::koszon(); szintaktikailag helyes, de kerülendő! Az objektum belső dolgait ne használjuk fel kívül. A C++ programozási nyelv Soós Sándor 6/12

Polimorfizmus, többalakúság Nézzük meg a pelda3.cpp fájlt! Mi történik, ha nem virtualnak deklarálom a Koszon függvényt? Vizsgáljuk meg az f1() f4() függvényeket! A C++ programozási nyelv Soós Sándor 7/12

Egy kis háttér: Early binding, late binding Mit befolyásol a virtual kulcsszó? Amikor a fordító találkozik egy metódus meghívásával, akkor kétféleképpen járhat el: ha a metódus nem virtuális, akkor a hívás helyére beírja az ott szereplő osztály hívott metódusának kezdőcímét, illetve az annak megfelelő jelzést. Ez fordítási időben megtörténik (early binding korai kötés) ha a metódus virtuális, akkor fordításkor csak egy hivatkozás kerül ide az osztályhoz tartozó Virtuális Metódus Tábla (VMT) megfelelő bejegyzésére A VMT futás időben kerül kitöltésre, csak ekkor dől el, hogy az egyes virtuális metódusok ténylegesen milyen memóriacímre mutatnak (late binding késői kötés) Nézzük meg az előző példa f1() függvényét! A C++ programozási nyelv Soós Sándor 8/12

Binding példa void f1( Szemely &sz) { printf("f1: "); sz.koszon(); }; Ha a Koszon() metódus nem virtuális, akkor az f1() lefordításakor sz.koszon() helyére a Szemely osztály Koszon metódusának címe kerül. Ha viszont Koszon() virtuális, akkor ide csak az a jelzés kerül, hogy az f1()-nek átadott paraméter VMT táblájának 1. helyén szereplő címre kell ugrani. Majd futás időben derül, ki, hogy az f1() függvénynek milyen típusú objektumot adtunk át. A polimorfizmus miatt ez valóban csak futásidőben derül ki. A C++ programozási nyelv Soós Sándor 9/12

Miért jó a polimorfizmus? Nézzük meg a Jegypenztar.cpp fájlt! Egy programozó megírta a Jegypenztar() függvényt. Később bármikor létrehozhatunk egy újabb leszármazottat a Szemelyből, arra is működni fog a Jegypenztar, még csak újra sem kell fordítani. Konténerben kezelt objektumok (geometria hf) Ha egy konténerben (például egy tömbben) szeretnénk tárolni különböző típusú objektumokat (például a síkidomokat), akkor a közös ősből hozzuk létre a konténert. (Tömb esetén csak pointerekkel működik mindez!) Ezek után egy ciklusban sorra lefuttathatjuk például a Kirajzoló, virtuális metódust. Minden síkidom esetén a megfelelő metódus fog lefutni. A C++ programozási nyelv Soós Sándor 10/12

Pure virtual, tisztán virtuális metódusok class Szemely { public: virtual void Koszon() = 0; }; Ezzel a szintaktikával jelöljük a tisztán virtuális metódusokat. Absztrakt osztály: van legalább egy tisztán virtuális tagfüggvénye nem példányosítható Nézzük meg az absztrakt.cpp fájlt! A C++ programozási nyelv Soós Sándor 11/12

Mire jók az absztrakt osztályok? Nyelvi eszközökkel segítik a tervezést. Az absztrakt osztályban deklaráljuk, hogy milyen metódusokat kell mindenképpen megvalósítani egy osztályban ahhoz, hogy példányosítani lehessen azt. Amíg nem írtuk meg az összes pure virtual metódust, addig nem lehet példányt létrehozni belőle. Miért fontos ez? ez azt jelenti, hogy ezekre a tulajdonságokra (metódusokra) biztosan számíthatunk minden leszármazott osztályban Tervezzük tovább a múlt órai geometriai oktatóprogramot az új fogalmak felhasználásával! A C++ programozási nyelv Soós Sándor 12/12