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