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



Hasonló dokumentumok
4. Öröklődés. Programozás II

Programozás C++ -ban 2007/4

117. AA Megoldó Alfréd AA 117.

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

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

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

Körkörös listák. fej. utolsó. utolsó. fej

Elemi alkalmazások fejlesztése IV. Adatbázis-kezelő GUI alkalmazás készítése 3. Összetett tábla karbantartása

Származtatási mechanizmus a C++ nyelvben

Bevezetés a C++ programozási nyelvbe

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

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

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:

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

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

Programozás C++ -ban

A lista eleme. mutató rész. adat rész. Listaelem létrehozása. Node Deklarálás. Létrehozás. Az elemet nekünk kell bef zni a listába

Géptermi zh-írás forgatókönyve

Programozás III CSOMAGOK. Az összetartozó osztályok és interfészek egy csomagba (package) kerülnek.

Objektumorientált programozás C# nyelven

Objektumorientált programozás C# nyelven

STL. Algoritmus. Iterátor. Tároló. Elsődleges komponensek: Tárolók Algoritmusok Bejárók

1. Alapok. Programozás II

500. AA Megoldó Alfréd AA 500.

Dinamikus csatolású függvénykönyvtár készítése és használata Plugin-szerű betöltés Egyszeű C++ osztályok készítése

Egységes és objektumközpontú adatbázis-kezelés (2. rész)

Objektumok inicializálása

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

500. CC Megoldó Alfréd CC 500.

Programozás II gyakorlat. 6. Polimorfizmus

3. Osztályok II. Programozás II

Programozás C++ -ban

Programozás C++ -ban 2007/7

INFORMATIKAI ALAPISMERETEK

Alprogramok, paraméterátadás

Objektumorientált programozás C# nyelven III.

infix kifejezés a+b ab+ +ab postfix kifejezés prefix kifejezés a+b ab+ +ab a+b ab+ +ab Készítette: Szabóné Nacsa Rozália

A C++ öröklés. (Előfeltétel: 12. tétel ismerete)

Osztályok. 4. gyakorlat

A feladat lényege egy felhasználói típusnak a zsák típusnak a megvalósítása.

Emlékeztető: a fordítás lépései. Szimbólumtábla-kezelés. Információáramlás. Információáramlás. Információáramlás.

Elemi alkalmazások fejlesztése III.

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

Információs Technológia

A Microsoft Visual Studio 2005 fejlesztőkörnyezet

C++ Gyakorlat jegyzet 7. óra

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

INFORMATIKAI ALAPISMERETEK

Objektumorientált programozás C# nyelven

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

Programozási alapismeretek beadandó feladat: ProgAlap beadandó feladatok téma 99. feladat 1

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.

Maximum kiválasztás tömbben

Kalapácsvetés 2016 szöveges

Programozás. C++ típusok, operátorok. Fodor Attila

Elemi alkalmazások fejlesztése III.

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

BME MOGI Gépészeti informatika 8.

Objektum elvű alkalmazások fejlesztése Kifejezés lengyel formára hozása és kiértékelése

Access adatbázis elérése OLE DB-n keresztül

Elemi alkalmazások fejlesztése IV.

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

Elemi alkalmazások fejlesztése III. A Qt assistant elindítása. Ajánlott ir odalom. A Qt assistant nyitó ablaka

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) {} };

503.AA Megoldo Arisztid 503.A

Objektum elvű alkalmazások fejlesztése 3. beadandó

Programozás 5. Dr. Iványi Péter

Információs Technológia

Bevezetés a programozásba 2

Országzászlók (2015. május 27., Sz14)

C#, OOP. Osztályok tervezése C#-ban

Elemi alkalmazások fejlesztése III.

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

PROGRAMOZÁSI NYELVEK - CPP. ELŐADÁS JEGYZET

PHP5 Új generáció (2. rész)

Programozás(A szakirány) II. beadandó feladat Farkas András HP6S15 1. csoport Veszprémi Anna / Hudoba Péter

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

500. DD Megoldó Alfréd DD 500.

Programozás s 2. C++ nyelven

228. AA Default Konstruktor AA 228.

Programozás BMEKOKAA146. Dr. Bécsi Tamás 1. Előadás

Bánsághi Anna

Mobil alkalmazások fejlesztése

C++ programozási nyelv

MySql elindítása. Elemi alkalmazások fejlesztése IV. Feladat. Az alkalmazás adatbázisa

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

Programozási nyelvek Java

OOP: Java 8.Gy: Gyakorlás

Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606. Dr. Bécsi Tamás

Rekurzió. Horváth Gyula.

Elemi alkalmazások fejlesztése

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

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

C++ programozási nyelv

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

Programozás C++ -ban

Java és web programozás

Alkalmazott modul: Programozás 6. előadás. Strukturált programozás: újrafelhasználható adattípusok

Átírás:

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

Feladat Egy játékfejlesztő cég olyan programot fejleszt, amely nyilvántartja az alkalmazottai adatait. Tároljuk minden személy: Nevét (legfeljebb 50 karakter) Születési dátumát Fizetését Írj osztályt, amely a fenti adatokat tárolja. Használd az egységbezárás elvét, és az osztálydeklaráció külön header fájlban, a definíció külön forrásfájlban legyen! 2

Megoldás: dolgozo.h #define MAX 51 class CDolgozo { protected: int fizetes; int ev, honap, nap; char nev[ MAX ]; public: CDolgozo(const char * nev); CDolgozo(const CDolgozo & orig); int GetFizetes() const; ; Ezt a kulcsszót később tisztázzuk! void GetSzuletes(int & ev, int & honap, int & nap) const; const char * GetNev() const; void SetFizetes(int f); void SetSzuletes(int ev, int honap, int nap); void SetNev(const char * nev); 3

Megoldás: dolgozo.cpp #include "dolgozo.h" #include <cstring> CDolgozo::CDolgozo(const char * nev) { SetNev(nev); fizetes = 0; ev = honap = nap = 0; CDolgozo::CDolgozo(const CDolgozo & orig) { SetNev(orig.nev); fizetes = orig.fizetes; ev = orig.fizetes; honap = orig.fizetes; nap = orig.fizetes; 4

Megoldás: dolgozo.cpp int CDolgozo::GetFizetes() const { return fizetes; void CDolgozo::GetSzuletes(int & ev, int & honap, int & nap) const { ev = this->ev; honap = this->honap; nap = this->nap; const char * CDolgozo::GetNev() const { return nev; void CDolgozo::SetFizetes(int f) { fizetes = f; 5

Megoldás: dolgozo.cpp void CDolgozo::SetSzuletes(int ev, int honap, int nap) { this->ev = ev; this->honap = honap; this->nap = nap; void CDolgozo::SetNev(const char * nev) { strcpy(this->nev, nev); 6

Megoldás: main.cpp #include <iostream> #include "dolgozo.h" using namespace std; #define UJ_DOLGOZO( neve ) CDolgozo neve ( #neve ) int main() { UJ_DOLGOZO( Carmack ); CDolgozo Romero("Romero"); cout<< Carmack.GetNev() <<endl; cout<< Romero.GetNev() <<endl; 7

Feladat A cégnél több fajta dolgozó van: programozó designer játék tesztelő 8

Feladat Írjunk olyan osztályt, amely egy programozó tulajdonságait tárolja: Szakmai ismeretek Munkakör A programozónak is van neve, fizetése és születési dátuma. Természetesen header + forrásfile-ban! 9

Megoldás 1. class CProgramozo { int fizetes; int ev, honap, nap; char nev[ MAX ], tudas[ MAX ], munka[ MAX ]; public: CProgramozo(const char * nev); CProgramozo(const CProgramozo & orig); int GetFizetes() const; void GetSzuletes(int & ev, int & honap, int & nap) const; const char * GetNev() const; void SetFizetes(int f); void SetSzuletes(int ev, int honap, int nap); void SetNev(const char * nev); const char * GetTudas() const; void SetTudas(const char * tudas); const char * GetMunkakor() const; void SetMunkakor(const char * munkakor); ; 10

Megoldás 1. class CProgramozo { int fizetes; int ev, honap, nap; char nev[ MAX ], tudas[ MAX ], munka[ MAX ]; public: CProgramozo(const char * nev); CProgramozo(const CProgramozo & orig); int GetFizetes() const; void GetSzuletes(int & ev, int & honap, int & nap) const; const char * GetNev() const; void SetFizetes(int f); void SetSzuletes(int ev, int honap, int nap); void SetNev(const char * nev); const char * GetTudas() const; void SetTudas(const char * tudas); const char * GetMunkakor() const; void SetMunkakor(const char * munkakor); ; 10

Megoldás 2. #include "dolgozo.h" class CProgramozo { CDolgozo d; char tudas[ MAX ], munka[ MAX ]; public: CProgramozo(const char * nev); CProgramozo(const CProgramozo & orig); int GetFizetes() const; void GetSzuletes(int & ev, int & honap, int & nap) const; const char * GetNev() const; void SetFizetes(int f) { d.setfizetes(f) ; void SetSzuletes(int ev, int honap, int nap); void SetNev(const char * nev); const char * GetTudas() const; void SetTudas(const char * tudas); const char * GetMunkakor() const; ; void SetMunkakor(const char * munkakor); 11

Megoldás 2. #include "dolgozo.h" class CProgramozo { CDolgozo d; char tudas[ MAX ], munka[ MAX ]; public: CProgramozo(const char * nev); CProgramozo(const CProgramozo & orig); int GetFizetes() const; void GetSzuletes(int & ev, int & honap, int & nap) const; const char * GetNev() const; void SetFizetes(int f) { d.setfizetes(f) ; void SetSzuletes(int ev, int honap, int nap); void SetNev(const char * nev); const char * GetTudas() const; void SetTudas(const char * tudas); const char * GetMunkakor() const; ; void SetMunkakor(const char * munkakor); 11

Megoldás 3. programozo.h #include "dolgozo.h" class CProgramozo: public CDolgozo { char tudas[ MAX ], munka[ MAX ]; public: CProgramozo(const char * nev); CProgramozo(const CProgramozo & orig); ; const char * GetTudas() const; void SetTudas(const char * tudas); const char * GetMunkakor() const; void SetMunkakor(const char * munkakor); 12

Megoldás 3. programozo.h #include "dolgozo.h" class CProgramozo: public CDolgozo { char tudas[ MAX ], munka[ MAX ]; public: CProgramozo(const char * nev); CProgramozo(const CProgramozo & orig); ; const char * GetTudas() const; void SetTudas(const char * tudas); const char * GetMunkakor() const; void SetMunkakor(const char * munkakor); 12

Megoldás: programozo.cpp #include <cstring> #include "programozo.h" CProgramozo::CProgramozo(const char * nev) { // nev????? tudas[0] = munka[0] = '\0'; CProgramozo::CProgramozo(const CProgramozo & orig) { SetTudas(orig.tudas); SetMunkakor(orig.munka); 13

Megoldás: programozo.cpp const char * CProgramozo::GetTudas() const { return tudas; void CProgramozo::SetTudas(const char * tudas) { strcpy(this->tudas, tudas); const char * CProgramozo::GetMunkakor() const { return munka; void CProgramozo::SetMunkakor(const char * munkakor) { strcpy(this->munka, munka); 14

Objektum létrehozása #include <iostream> #include "dolgozo.h" #include "programozo.h" using namespace std; #define UJ_DOLGOZO( neve ) CDolgozo neve ( #neve ) #define UJ_PROGRAMOZO( neve ) CProgramozo neve ( #neve ) int main() { UJ_PROGRAMOZO( Carmack ); CDolgozo Romero("Romero"); cout<< Carmack.GetNev() <<endl; cout<< Romero.GetNev() <<endl; 15

Objektum létrehozása #include <iostream> #include "dolgozo.h" #include "programozo.h" using namespace std; Mi lesz a probléma? #define UJ_DOLGOZO( neve ) CDolgozo neve ( #neve ) #define UJ_PROGRAMOZO( neve ) CProgramozo neve ( #neve ) int main() { UJ_PROGRAMOZO( Carmack ); CDolgozo Romero("Romero"); cout<< Carmack.GetNev() <<endl; cout<< Romero.GetNev() <<endl; 15

Probléma: ősosztály konstruktora Az ősosztály konstruktora hívódik meg, majd a származtatott osztályé 16

Probléma: ősosztály konstruktora Az ősosztály konstruktora hívódik meg, majd a származtatott osztályé Az ősosztály konstruktora paramétert vár 16

Probléma: ősosztály konstruktora Az ősosztály konstruktora hívódik meg, majd a származtatott osztályé Az ősosztály konstruktora paramétert vár Valahogy át kell adni az ősosztály konstruktorának a paramétert 16

Megoldás CProgramozo::CProgramozo(const char * nev) : CDolgozo(nev) { tudas[0] = munka[0] = '\0'; CProgramozo::CProgramozo(const CProgramozo & orig): CDolgozo(orig) { SetTudas(orig.tudas); SetMunkakor(orig.munka); 17

Ősosztály származtatott osztály Carmack típusa: CProgramozo Romero típusa: CDolgozo void fizetes_kiir(cdolgozo & dolgozo) { cout<<"fizetese: "<<dolgozo.getfizetes()<<endl; fizetes_kiir(carmack); // fizetes_kiir(romero); // 18

Ősosztály származtatott osztály Carmack típusa: CProgramozo Romero típusa: CDolgozo void fizetes_kiir(cdolgozo & dolgozo) { cout<<"fizetese: "<<dolgozo.getfizetes()<<endl; fizetes_kiir(carmack); // fizetes_kiir(romero); // 18

Ősosztály származtatott osztály Carmack típusa: CProgramozo Romero típusa: CDolgozo void fizetes_kiir(cdolgozo & dolgozo) { cout<<"fizetese: "<<dolgozo.getfizetes()<<endl; fizetes_kiir(carmack); fizetes_kiir(romero); // // Minden programozó dolgozó is 18

Ősosztály származtatott osztály Carmack típusa: CProgramozo Romero típusa: CDolgozo void fizetes_kiir(cprogramozo & prg) { cout<<"fizetese: "<<prg.getfizetes()<<endl; fizetes_kiir(carmack); // fizetes_kiir(romero); // 19

Ősosztály származtatott osztály Carmack típusa: CProgramozo Romero típusa: CDolgozo void fizetes_kiir(cprogramozo & prg) { cout<<"fizetese: "<<prg.getfizetes()<<endl; fizetes_kiir(carmack); // fizetes_kiir(romero); // 19

Ősosztály származtatott osztály Carmack típusa: CProgramozo Romero típusa: CDolgozo void fizetes_kiir(cprogramozo & prg) { cout<<"fizetese: "<<prg.getfizetes()<<endl; fizetes_kiir(carmack); fizetes_kiir(romero); // // de nem minden dolgozó programozó! 19

Függvény felülírás Írjunk egy SetFizetes függvényt a Cprogramozo osztályba, amely a paraméterben kapott fizetéshez hozzáad 50000-et, és a kapott értéket tárolja el. Ehhez használjuk fel az ősosztály SetFizetes függvényét! 20

Függvény felülírás Mi történik? void CProgramozo::SetFizetes(int i) { SetFizetes(i + 50000); 21

Függvény felülírás Mi történik? void CProgramozo::SetFizetes(int i) { SetFizetes(i + 50000); A függvény önmagát hívja meg. Ám mi az ősosztály SetFizetes függvényét szeretnénk meghívni: void CProgramozo::SetFizetes(int i) { CDolgozo::SetFizetes(i + 50000); 21

protected hozzáférés Emlékeztető: class CDolgozo { protected: int fizetes; int ev, honap, nap; protected: Kívülről nem látható, de a származtatott és saját osztályban igen. 22

Emlékeztető private: Kívülről és a származtatott osztályból nem látható. public: Kívülről és a származtatott osztályból is látható. 23

private öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: private A { void f() { a = 0; // b = 0; // c = 0; // ; class C: public B { void g() { a = 0; // b = 0; // c = 0; // ; 24

private öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: private A { void f() { b = 0; // c = 0; // ; class C: public B { void g() { a = 0; // b = 0; // c = 0; // ; 24

private öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: private A { void f() { c = 0; // ; class C: public B { void g() { a = 0; // b = 0; // c = 0; // ; 24

private öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: private A { void f() { c = 0; // ; class C: public B { void g() { a = 0; // b = 0; // c = 0; // ; 24

private öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: private A { void f() { c = 0; // ; class C: public B { void g() { a = 0; // b = 0; // c = 0; // ; 24

private öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: private A { void f() { c = 0; // ; class C: public B { void g() { b = 0; // c = 0; // ; 24

private öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: private A { void f() { c = 0; // ; class C: public B { void g() { c = 0; // ; 24

private öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: private A { void f() { c = 0; // ; class C: public B { void g() { c = 0; // ; 24

private öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: private A { void f() { c = 0; // ; class C: public B { void g() { c = 0; // ; 24

private öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: private A { void f() { c = 0; // ; class C: public B { void g() { c = 0; // ; 24

protected öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: protected A { void f() { a = 0; // b = 0; // c = 0; // ; class C: public B { void g() { a = 0; // b = 0; // c = 0; // ; 25

protected öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: protected A { void f() { b = 0; // c = 0; // ; class C: public B { void g() { a = 0; // b = 0; // c = 0; // ; 25

protected öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: protected A { void f() { c = 0; // ; class C: public B { void g() { a = 0; // b = 0; // c = 0; // ; 25

protected öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: protected A { void f() { c = 0; // ; class C: public B { void g() { a = 0; // b = 0; // c = 0; // ; 25

protected öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: protected A { void f() { c = 0; // ; class C: public B { void g() { a = 0; // b = 0; // c = 0; // ; 25

protected öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: protected A { void f() { c = 0; // ; class C: public B { void g() { b = 0; // c = 0; // ; 25

protected öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: protected A { void f() { c = 0; // ; class C: public B { void g() { c = 0; // ; 25

protected öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: protected A { void f() { c = 0; // ; class C: public B { void g() { c = 0; // ; 25

protected öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: protected A { void f() { c = 0; // ; class C: public B { void g() { c = 0; // ; 25

protected öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: protected A { void f() { c = 0; // ; class C: public B { void g() { c = 0; // ; 25

public öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: public A { void f() { a = 0; // b = 0; // c = 0; // ; class C: public B { void g() { a = 0; // b = 0; // c = 0; // ; 26

public öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: public A { void f() { b = 0; // c = 0; // ; class C: public B { void g() { a = 0; // b = 0; // c = 0; // ; 26

public öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: public A { void f() { c = 0; // ; class C: public B { void g() { a = 0; // b = 0; // c = 0; // ; 26

public öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: public A { void f() { c = 0; // ; class C: public B { void g() { a = 0; // b = 0; // c = 0; // ; 26

public öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: public A { void f() { c = 0; // ; class C: public B { void g() { a = 0; // b = 0; // c = 0; // ; 26

public öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: public A { void f() { c = 0; // ; class C: public B { void g() { b = 0; // c = 0; // ; 26

public öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: public A { void f() { c = 0; // ; class C: public B { void g() { c = 0; // ; 26

public öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: public A { void f() { c = 0; // ; class C: public B { void g() { c = 0; // ; 26

public öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: public A { void f() { c = 0; // ; class C: public B { void g() { c = 0; // ; 26

public öröklődés class A { A * pa; private: int a; B b; protected: int b; pa = &b; // public: int c; ; class B: public A { void f() { c = 0; // ; class C: public B { void g() { c = 0; // ; 26