Miskolci Egyetem Általános Informatikai Tanszák
Származtatási mechanizmus a C++ nyelvben Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék Ficsor Lajos
CPP2 /
1
Az öröklő klődés fogalma 1. Egy osztály deklarálható valamely más osztály(ok) leszármazottjaként. Az deklaráció formája: class név: [kulcsszo] osztalynev1 [, [kulcsszo] osztalynev2 ... ] { // itt jön a tagok deklarációja } Öröklődés: inheritance Ficsor Lajos
A C++ programozási nyelv 2. (Öröklődés)
CPP2 /
2
Az öröklő klődés fogalma 2. • A kulcsszo (amely az öröklés módját írja elő) lehet public vagy private • Ha a kulcsszo hiányzik, az alapértelmezés private (információ rejtés alapelve!) • Az osztálynev1 nevű osztály a szülő, vagy ős osztály. (base class)
Ficsor Lajos
Ficsor Lajos
A C++ programozási nyelv 2. (Öröklődés)
CPP2 /
3
CPP2/ 1
Miskolci Egyetem Általános Informatikai Tanszák
Az öröklő klődés fogalma 3. • A név osztály rendelkezik – a szülő osztály tagjaival – a saját tagjaival
• Az ős osztály elemeinek az elérése a leszármazott osztályból nem feltétlenül garantált. • Öröklődnek bizonyos tulajdonságok. Pl. – operátor overloading – friend függvények és osztályok
Ficsor Lajos
A C++ programozási nyelv 2. (Öröklődés)
CPP2 /
4
Az öröklő klődés fogalma 4. • Az öröklődési hierarchia tetszőleges lehet. – Egyetlen korlátozás: egy osztály még közvetett módon sem lehet saját maga őse.
• Az ős osztály továbbra is használható önmagában is.
Ficsor Lajos
A C++ programozási nyelv 2. (Öröklődés)
CPP2 /
5
Egyszerű példa: CPPEX6.CPP Az egyszerű hierarchiára példa a CPPEX6.CPP Ez szemlélteti: • akkor érdemes használni, ha a modellezendő valóságos objektumok viszonya is hierarchikus • az öröklést tartalmazó definíciót • azonos nevű függvények a különböző szinteken. Ez újradeklarálás, nem pedig függvény overloading. (SCOPE operátor használata!) • a public öröklési módot Ficsor Lajos
Ficsor Lajos
A C++ programozási nyelv 2. (Öröklődés)
CPP2 /
6
CPP2/ 2
Miskolci Egyetem Általános Informatikai Tanszák
Egyszerű példa: jarmu osztály class jarmu { // public oroklesi mod int kerekek; double suly; public: void kezdoertek(int k, double s) {kerekek = k; suly = s;} int kerekszam (void) { return kerekek;} double kerekterheles(void) {return suly / kerekek; }; double sulya() {return suly;} }; Ficsor Lajos
A C++ programozási nyelv 2. (Öröklődés)
CPP2 /
7
Egyszerű példa: gepkocsi osztály class gepkocsi : public jarmu { int szemelyek; public: void kezdoertek(int k, double s, int szem) {szemelyek = szem; jarmu::kezdoertek(k, s); } }; Ficsor Lajos
A C++ programozási nyelv 2. (Öröklődés)
CPP2 /
8
Egyszerű példa: teherauto osztály class teherauto : public jarmu { int szemelyek; double raksuly; public: void teher_kezdoertek (int szem,double rs) {szemelyek = szem; raksuly = rs; } double kerekterheles() {return (sulya() + raksuly + szemelyek*60.) / kerekszam(); } // suly + … hibas lenne, mert suly // nem elérhető!!! }; 9 Ficsor Lajos
Ficsor Lajos
A C++ programozási nyelv 2. (Öröklődés)
CPP2 /
CPP2/ 3
Miskolci Egyetem Általános Informatikai Tanszák
Egyszerű példa: bicikli objektum main () { jarmu bicikli; bicikli.kezdoertek(2,15.0); cout << "Bicikli kerekeinek szama " << bicikli.kerekszam() << "\n"; cout << "Bicikli kerekterhelese: " << bicikli.kerekterheles() << "\n";
Ficsor Lajos
A C++ programozási nyelv 2. (Öröklődés)
CPP2 /
10
CPP2 /
11
A bicikli objektum felépítése • Az objektum típusa jarmu kerekek
class jarmu
súly
Ficsor Lajos
A C++ programozási nyelv 2. (Öröklődés)
Egyszerű példa: trabant objektum gepkocsi trabant; trabant.kezdoertek (4, 600.0, 4); cout << "Trabant kerekeinek szama: " << trabant.kerekszam() << "\n";
Ficsor Lajos
Ficsor Lajos
A C++ programozási nyelv 2. (Öröklődés)
CPP2 /
12
CPP2/ 4
Miskolci Egyetem Általános Informatikai Tanszák
• Az objektum gepkocsi típusú kerekek
class jarmu
súly szemelyek
Ficsor Lajos
Gepkocsi sajat adattagja
A C++ programozási nyelv 2. (Öröklődés)
class gepkocsi
A trabant objektum felépítése
CPP2 /
13
CPP2 /
14
CPP2 /
15
Egyszerű példa: ifa objektum teherauto ifa; ifa.kezdoertek(6, 1200.0); ifa.teher_kezdoertek(2,2500.0); cout << "Max. kerekterheles: " << ifa.kerekterheles() << "\n"; }
Ficsor Lajos
A C++ programozási nyelv 2. (Öröklődés)
Egyszerű példa: eredmény Eredmény: Bicikli kerekeinek szama: 2 Bicikli kerekterhelese: 7.5 Trabant kerekeinek szama: 4 Max. kerekterheles: 636.667
Ficsor Lajos
Ficsor Lajos
A C++ programozási nyelv 2. (Öröklődés)
CPP2/ 5
Miskolci Egyetem Általános Informatikai Tanszák
Láthatósági kulcsszavak Egy osztály mezőinek láthatósága lehet: • public: a mező bárhol használható, ahol az osztály ismert • protected: a mező az adott osztály és annak valamennyi leszármazott osztálya számára ismert • private: a mező csak az adott osztály számára ismert Az öröklés módja ezek hatását módosíthatja a leszármazott osztályok számára! Ficsor Lajos
A C++ programozási nyelv 2. (Öröklődés)
CPP2 /
16
CPP2 /
17
Láthatóság és öröklődés 1. Öröklés módja
Láthatóság (ős)
public
public
Láthatóság (leszármazott) public
protected
protected
private
nem elérhető
public
private
protected
private
private
nem elérhető
private
Ficsor Lajos
A C++ programozási nyelv 2. (Öröklődés)
Láthatóság és öröklődés 2. Megjegyzések: • Az öröklés módja csak korlátozhatja a hatáskört. • Egy leszármazott osztály elérési joga kisebb, mind a friend osztályé. • Példák: CPPEX7.C és CPPEX8.C – A kulsofgv használhatja a c,e és Xfgv tagokat. – Az Xfgv használhatja a b,c,d,e és Bfgv tagokat.
Ficsor Lajos
Ficsor Lajos
A C++ programozási nyelv 2. (Öröklődés)
CPP2 /
18
CPP2/ 6
Miskolci Egyetem Általános Informatikai Tanszák
Példa élda private öröklé klési módra (cppex6a) class jarmu { int kerekek; double suly; public: void kezdoertek(int k, double s) {kerekek = k; suly = s;} int hanykerek (void) { return kerekek;} double kerekterheles(void) {return suly / kerekek; }; double sulya(void) {return suly;} }; Ficsor Lajos
A C++ programozási nyelv 2. (Öröklődés)
CPP2 /
19
Példa élda private öröklé klési módra (cppex6a) class gepkocsi : jarmu {//alapért: private int szemelyek; public: void kezdoertek(int k, double s, int szem) { szemelyek = szem; jarmu::kezdoertek(k, s); } }; Ficsor Lajos
A C++ programozási nyelv 2. (Öröklődés)
CPP2 /
20
Példa élda private öröklé klési módra (cppex6a) main () { gepkocsi trabant; trabant.kezdoertek (4, 600.0, 4); // double jarmu::sulya() is inaccessible // within this context Cout << "Trabant sulya:" << trabant.sulya() << "\n"; // Az örökölt sulya fgv. private // láthatóságú! } Ficsor Lajos
Ficsor Lajos
A C++ programozási nyelv 2. (Öröklődés)
CPP2 /
21
CPP2/ 7
Miskolci Egyetem Általános Informatikai Tanszák
Megoldás wrapper függvénnyel (cppex6b) class jarmu { // ugyanaz, mint előbb }; class gepkocsi : jarmu { int szemelyek; public: void kezdoertek(int k, double s, int szem) {// Ugyanaz, mint előbb } // Ez a wrapper fuggveny double sulya(void) { return jarmu::sulya();} }; Ficsor Lajos
A C++ programozási nyelv 2. (Öröklődés)
CPP2 /
22
Megoldás explicit átmin ősítéssel (cppex6c) átminő class jarmu { // ugyanaz, mint előbb }; class gepkocsi : jarmu { int szemelyek; public: void kezdoertek(int k, double s, int szem) {// Ugyanaz, mint előbb } // A sulya fgv-t explicite public-a // tesszuk jarmu::sulya; }; Ficsor Lajos
A C++ programozási nyelv 2. (Öröklődés)
CPP2 /
23
Konstruktorok és destruktorok 1. • Egy leszármaztatott objektum létrehozásakor először a szülő osztály(ok) konstruktora(i) hajtódnak végre (a deklaráció sorrendjében), majd a leszármaztatott osztályé. • A leszármazott osztály konstruktora kijelölheti az ősosztály megfelelő konstruktorát a definíciójában megadott taginicializációs listával. (Formáját lásd a példában) • További szabályok is vannak. Ficsor Lajos
Ficsor Lajos
A C++ programozási nyelv 2. (Öröklődés)
CPP2 /
24
CPP2/ 8
Miskolci Egyetem Általános Informatikai Tanszák
Konstruktorok és destruktorok 2. • A destruktorok végrehajtási sorrendje most is pontosan fordítottja a konstruktorénak. • Egyszerű példa: CPPEX11.C
Ficsor Lajos
A C++ programozási nyelv 2. (Öröklődés)
CPP2 /
25
CPP2 /
26
cppex11.C 1. class jarmu { protected: int kerekek; double suly; public: jarmu (int k, double s) {kerekek = k; suly = s;} int hanykerek(void {return kerekek;} }; Ficsor Lajos
A C++ programozási nyelv 2. (Öröklődés)
cppex11.C 2. class gepkocsi : public jarmu { protected: int szemelyek; public: gepkocsi(int k,double s,int szem) : jarmu (k, s) {szemelyek = szem;} }; Ficsor Lajos
Ficsor Lajos
A C++ programozási nyelv 2. (Öröklődés)
CPP2 /
27
CPP2/ 9
Miskolci Egyetem Általános Informatikai Tanszák
cppex11.C 3. main () { jarmu bicikli (2,15); cout<< "Bicikli kerekeinek szama: " << bicikli.hanykerek() << "\n"; gepkocsi trabant (4, 120.0, 4); cout<< "Trabant kerekeinek szama: " << trabant.hanykerek() << "\n"; } Ficsor Lajos
Ficsor Lajos
A C++ programozási nyelv 2. (Öröklődés)
CPP2 /
28
CPP2/ 10