származtatási mechanizmus a c++ nyelvben
DESCRIPTION
Származtatási mechanizmus a C++ nyelvben. Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék. Az öröklődés fogalma 1. Egy osztály deklarálható valamely más osztály(ok) leszármazottjaként. Az deklaráció formája: - PowerPoint PPT PresentationTRANSCRIPT
FicsorLajos
CPP2 / 1
Származtatási mechanizmus a C++ Származtatási mechanizmus a C++ nyelvbennyelvben
Ficsor Lajos
Miskolci Egyetem
Általános Informatikai Tanszék
FicsorLajos
A C++ programozási nyelv 2. (Öröklődés) CPP2 / 2
Az öröklődés fogalmaAz öröklődés fogalma 1. 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
FicsorLajos
A C++ programozási nyelv 2. (Öröklődés) CPP2 / 3
Az öröklődés fogalmaAz öröklődés fogalma 2. 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)
FicsorLajos
A C++ programozási nyelv 2. (Öröklődés) CPP2 / 4
Az öröklődés fogalmaAz öröklődés fogalma 3. 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
FicsorLajos
A C++ programozási nyelv 2. (Öröklődés) CPP2 / 5
Az öröklődés fogalmaAz öröklődés fogalma 4. 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.
FicsorLajos
A C++ programozási nyelv 2. (Öröklődés) CPP2 / 6
Egyszerű példa: Egyszerű példa: CPPEX6.CPPCPPEX6.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
FicsorLajos
A C++ programozási nyelv 2. (Öröklődés) CPP2 / 7
Egyszerű példa: Egyszerű példa: jarmujarmu osztály osztály
class jarmu { // public oroklesi modint 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;}
};
FicsorLajos
A C++ programozási nyelv 2. (Öröklődés) CPP2 / 8
Egyszerű példa: Egyszerű példa: gepkocsigepkocsi osztály osztály
class gepkocsi : public jarmu {
int szemelyek;
public:
void kezdoertek(int k, double s, int szem)
{szemelyek = szem;
jarmu::kezdoertek(k, s); }
};
FicsorLajos
A C++ programozási nyelv 2. (Öröklődés) CPP2 / 9
Egyszerű példa: Egyszerű példa: teherautoteherauto osztály osztályclass 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ő!!!};
FicsorLajos
A C++ programozási nyelv 2. (Öröklődés) CPP2 / 10
Egyszerű példa: Egyszerű példa: biciklibicikli objektum objektum
main ()
{
jarmu bicikli;
bicikli.kezdoertek(2,15.0);
cout << "Bicikli kerekeinek szama " <<
bicikli.kerekszam() << "\n";
cout << "Bicikli kerekterhelese: " <<
bicikli.kerekterheles() << "\n";
FicsorLajos
A C++ programozási nyelv 2. (Öröklődés) CPP2 / 11
A A biciklibicikli objektum felépítése objektum felépítése
• Az objektum típusa jarmu
class jarmukerekek
súly
FicsorLajos
A C++ programozási nyelv 2. (Öröklődés) CPP2 / 12
Egyszerű példa: Egyszerű példa: trabanttrabant objektum objektum
gepkocsi trabant;
trabant.kezdoertek (4, 600.0, 4);
cout << "Trabant kerekeinek szama: " <<
trabant.kerekszam() << "\n";
FicsorLajos
A C++ programozási nyelv 2. (Öröklődés) CPP2 / 13
A A trabanttrabant objektum felépítése objektum felépítése
• Az objektum gepkocsi típusú
class jarmukerekek
súly
szemelyek Gepkocsi sajatadattagja
class gepkocsi
FicsorLajos
A C++ programozási nyelv 2. (Öröklődés) CPP2 / 14
Egyszerű példa: Egyszerű példa: ifaifa objektum objektum
teherauto ifa;
ifa.kezdoertek(6, 1200.0);
ifa.teher_kezdoertek(2,2500.0);
cout << "Max. kerekterheles: " <<
ifa.kerekterheles() << "\n";
}
FicsorLajos
A C++ programozási nyelv 2. (Öröklődés) CPP2 / 15
Egyszerű példa: eredményEgyszerű példa: eredmény
Eredmény:
Bicikli kerekeinek szama: 2
Bicikli kerekterhelese: 7.5
Trabant kerekeinek szama: 4
Max. kerekterheles: 636.667
FicsorLajos
A C++ programozási nyelv 2. (Öröklődés) CPP2 / 16
Láthatósági kulcsszavakLá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!
FicsorLajos
A C++ programozási nyelv 2. (Öröklődés) CPP2 / 17
Láthatóság és öröklődés 1.Láthatóság és öröklődés 1.
Öröklés módja Láthatóság (ős) Láthatóság (leszármazott)
public public public
protected protected
private nem elérhető
private public private
protected private
private nem elérhető
FicsorLajos
A C++ programozási nyelv 2. (Öröklődés) CPP2 / 18
Láthatóság és öröklődés 2.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.
FicsorLajos
A C++ programozási nyelv 2. (Öröklődés) CPP2 / 19
PPéldélda private a private öörrööklkléési msi módra (cppex6a)ó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;}
};
FicsorLajos
A C++ programozási nyelv 2. (Öröklődés) CPP2 / 20
PPéldélda private a private öörrööklkléési msi módra (cppex6a)ó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);
}
};
FicsorLajos
A C++ programozási nyelv 2. (Öröklődés) CPP2 / 21
PPéldélda private a private öörrööklkléési msi módra (cppex6a)ódra (cppex6a)main (){gepkocsi trabant;trabant.kezdoertek (4, 600.0, 4);// double jarmu::sulya() is inaccessible// within this contextCout << "Trabant sulya:" << trabant.sulya() << "\n";
// Az örökölt sulya fgv. private// láthatóságú!}
FicsorLajos
A C++ programozási nyelv 2. (Öröklődés) CPP2 / 22
Megoldás wrapper függvénnyel (cppex6b)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();}};
FicsorLajos
A C++ programozási nyelv 2. (Öröklődés) CPP2 / 23
Megoldás explicit áMegoldás explicit átmintminőőssííttéésselssel (cppex6c) (cppex6c)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;};
FicsorLajos
A C++ programozási nyelv 2. (Öröklődés) CPP2 / 24
Konstruktorok és destruktorokKonstruktorok és destruktorok 1. 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.
FicsorLajos
A C++ programozási nyelv 2. (Öröklődés) CPP2 / 25
Konstruktorok és destruktorokKonstruktorok és destruktorok 2. 2.
• A destruktorok végrehajtási sorrendje most is pontosan fordítottja a konstruktorénak.
• Egyszerű példa: CPPEX11.C
FicsorLajos
A C++ programozási nyelv 2. (Öröklődés) CPP2 / 26
cppex11.Ccppex11.C 1. 1.
class jarmu {protected:int kerekek;double suly;
public:jarmu (int k, double s)
{kerekek = k; suly = s;}int hanykerek(void
{return kerekek;}};
FicsorLajos
A C++ programozási nyelv 2. (Öröklődés) CPP2 / 27
cppex11.Ccppex11.C 2. 2.
class gepkocsi : public jarmu {
protected:
int szemelyek;
public:
gepkocsi(int k,double s,int szem) : jarmu (k, s)
{szemelyek = szem;}
};
FicsorLajos
A C++ programozási nyelv 2. (Öröklődés) CPP2 / 28
cppex11.Ccppex11.C 3. 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";
}