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
Ezt a kulcsszót
class CDolgozo { protected: később tisztázzuk! int fizetes; int ev, honap, nap; char nev[ MAX ]; public: CDolgozo(const char * nev); CDolgozo(const CDolgozo & 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); };
3
Megoldás: dolgozo.cpp #include "dolgozo.h" #include
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 #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 #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 #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 #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 { private: int a; protected: int b; public: int c; }; class B: private A { void f() { a = 0; // b = 0; // c = 0; // A * p = this; // } }; class C: public B { void g() { a = 0; // b = 0; // c = 0; // A * p = this; // } };
A * pa; B b; pa = &b; //
24
private öröklődés class A { private: int a; protected: int b; public: int c; }; class B: private A { void f() { a = 0; // b = 0; // c = 0; // A * p = this; // } }; class C: public B { void g() { a = 0; // b = 0; // c = 0; // A * p = this; // } };
A * pa; B b; pa = &b; //
24
private öröklődés class A { private: int a; protected: int b; public: int c; }; class B: private A { void f() { a = 0; // b = 0; // c = 0; // A * p = this; // } }; class C: public B { void g() { a = 0; // b = 0; // c = 0; // A * p = this; // } };
A * pa; B b; pa = &b; //
24
private öröklődés class A { private: int a; protected: int b; public: int c; }; class B: private A { void f() { a = 0; // b = 0; // c = 0; // A * p = this; // } }; class C: public B { void g() { a = 0; // b = 0; // c = 0; // A * p = this; // } };
A * pa; B b; pa = &b; //
24
private öröklődés class A { private: int a; protected: int b; public: int c; }; class B: private A { void f() { a = 0; // b = 0; // c = 0; // A * p = this; // } }; class C: public B { void g() { a = 0; // b = 0; // c = 0; // A * p = this; // } };
A * pa; B b; pa = &b; //
24
private öröklődés class A { private: int a; protected: int b; public: int c; }; class B: private A { void f() { a = 0; // b = 0; // c = 0; // A * p = this; // } }; class C: public B { void g() { a = 0; // b = 0; // c = 0; // A * p = this; // } };
A * pa; B b; pa = &b; //
24
private öröklődés class A { private: int a; protected: int b; public: int c; }; class B: private A { void f() { a = 0; // b = 0; // c = 0; // A * p = this; // } }; class C: public B { void g() { a = 0; // b = 0; // c = 0; // A * p = this; // } };
A * pa; B b; pa = &b; //
24
private öröklődés class A { private: int a; protected: int b; public: int c; }; class B: private A { void f() { a = 0; // b = 0; // c = 0; // A * p = this; // } }; class C: public B { void g() { a = 0; // b = 0; // c = 0; // A * p = this; // } };
A * pa; B b; pa = &b; //
24
private öröklődés class A { private: int a; protected: int b; public: int c; }; class B: private A { void f() { a = 0; // b = 0; // c = 0; // A * p = this; // } }; class C: public B { void g() { a = 0; // b = 0; // c = 0; // A * p = this; // } };
A * pa; B b; pa = &b; //
24
private öröklődés class A { private: int a; protected: int b; public: int c; }; class B: private A { void f() { a = 0; // b = 0; // c = 0; // A * p = this; // } }; class C: public B { void g() { a = 0; // b = 0; // c = 0; // A * p = this; // } };
A * pa; B b; pa = &b; //
24
protected öröklődés class A { private: int a; protected: int b; public: int c; }; class B: protected A { void f() { a = 0; // b = 0; // c = 0; // A * p = this; // } }; class C: public B { void g() { a = 0; // b = 0; // c = 0; // A * p = this; // } };
A * pa; B b; pa = &b; //
25
protected öröklődés class A { private: int a; protected: int b; public: int c; }; class B: protected A { void f() { a = 0; // b = 0; // c = 0; // A * p = this; // } }; class C: public B { void g() { a = 0; // b = 0; // c = 0; // A * p = this; // } };
A * pa; B b; pa = &b; //
25
protected öröklődés class A { private: int a; protected: int b; public: int c; }; class B: protected A { void f() { a = 0; // b = 0; // c = 0; // A * p = this; // } }; class C: public B { void g() { a = 0; // b = 0; // c = 0; // A * p = this; // } };
A * pa; B b; pa = &b; //
25
protected öröklődés class A { private: int a; protected: int b; public: int c; }; class B: protected A { void f() { a = 0; // b = 0; // c = 0; // A * p = this; // } }; class C: public B { void g() { a = 0; // b = 0; // c = 0; // A * p = this; // } };
A * pa; B b; pa = &b; //
25
protected öröklődés class A { private: int a; protected: int b; public: int c; }; class B: protected A { void f() { a = 0; // b = 0; // c = 0; // A * p = this; // } }; class C: public B { void g() { a = 0; // b = 0; // c = 0; // A * p = this; // } };
A * pa; B b; pa = &b; //
25
protected öröklődés class A { private: int a; protected: int b; public: int c; }; class B: protected A { void f() { a = 0; // b = 0; // c = 0; // A * p = this; // } }; class C: public B { void g() { a = 0; // b = 0; // c = 0; // A * p = this; // } };
A * pa; B b; pa = &b; //
25
protected öröklődés class A { private: int a; protected: int b; public: int c; }; class B: protected A { void f() { a = 0; // b = 0; // c = 0; // A * p = this; // } }; class C: public B { void g() { a = 0; // b = 0; // c = 0; // A * p = this; // } };
A * pa; B b; pa = &b; //
25
protected öröklődés class A { private: int a; protected: int b; public: int c; }; class B: protected A { void f() { a = 0; // b = 0; // c = 0; // A * p = this; // } }; class C: public B { void g() { a = 0; // b = 0; // c = 0; // A * p = this; // } };
A * pa; B b; pa = &b; //
25
protected öröklődés class A { private: int a; protected: int b; public: int c; }; class B: protected A { void f() { a = 0; // b = 0; // c = 0; // A * p = this; // } }; class C: public B { void g() { a = 0; // b = 0; // c = 0; // A * p = this; // } };
A * pa; B b; pa = &b; //
25
protected öröklődés class A { private: int a; protected: int b; public: int c; }; class B: protected A { void f() { a = 0; // b = 0; // c = 0; // A * p = this; // } }; class C: public B { void g() { a = 0; // b = 0; // c = 0; // A * p = this; // } };
A * pa; B b; pa = &b; //
25
public öröklődés class A { private: int a; protected: int b; public: int c; }; class B: public A { void f() { a = 0; b = 0; c = 0; A * p = this; } }; class C: public B { void g() { a = 0; b = 0; c = 0; A * p = this; } };
A * pa; B b; pa = &b; //
// // // //
// // // //
26
public öröklődés class A { private: int a; protected: int b; public: int c; }; class B: public A { void f() { a = 0; b = 0; c = 0; A * p = this; } }; class C: public B { void g() { a = 0; b = 0; c = 0; A * p = this; } };
A * pa; B b; pa = &b; //
// // // //
// // // //
26
public öröklődés class A { private: int a; protected: int b; public: int c; }; class B: public A { void f() { a = 0; b = 0; c = 0; A * p = this; } }; class C: public B { void g() { a = 0; b = 0; c = 0; A * p = this; } };
A * pa; B b; pa = &b; //
// // // //
// // // //
26
public öröklődés class A { private: int a; protected: int b; public: int c; }; class B: public A { void f() { a = 0; b = 0; c = 0; A * p = this; } }; class C: public B { void g() { a = 0; b = 0; c = 0; A * p = this; } };
A * pa; B b; pa = &b; //
// // // //
// // // //
26
public öröklődés class A { private: int a; protected: int b; public: int c; }; class B: public A { void f() { a = 0; b = 0; c = 0; A * p = this; } }; class C: public B { void g() { a = 0; b = 0; c = 0; A * p = this; } };
A * pa; B b; pa = &b; //
// // // //
// // // //
26
public öröklődés class A { private: int a; protected: int b; public: int c; }; class B: public A { void f() { a = 0; b = 0; c = 0; A * p = this; } }; class C: public B { void g() { a = 0; b = 0; c = 0; A * p = this; } };
A * pa; B b; pa = &b; //
// // // //
// // // //
26
public öröklődés class A { private: int a; protected: int b; public: int c; }; class B: public A { void f() { a = 0; b = 0; c = 0; A * p = this; } }; class C: public B { void g() { a = 0; b = 0; c = 0; A * p = this; } };
A * pa; B b; pa = &b; //
// // // //
// // // //
26
public öröklődés class A { private: int a; protected: int b; public: int c; }; class B: public A { void f() { a = 0; b = 0; c = 0; A * p = this; } }; class C: public B { void g() { a = 0; b = 0; c = 0; A * p = this; } };
A * pa; B b; pa = &b; //
// // // //
// // // //
26
public öröklődés class A { private: int a; protected: int b; public: int c; }; class B: public A { void f() { a = 0; b = 0; c = 0; A * p = this; } }; class C: public B { void g() { a = 0; b = 0; c = 0; A * p = this; } };
A * pa; B b; pa = &b; //
// // // //
// // // //
26
public öröklődés class A { private: int a; protected: int b; public: int c; }; class B: public A { void f() { a = 0; b = 0; c = 0; A * p = this; } }; class C: public B { void g() { a = 0; b = 0; c = 0; A * p = this; } };
A * pa; B b; pa = &b; //
// // // //
// // // //
26