Top Banner
Ficsor Lajos CPP2 / 1 Származtatási mechanizmus a Származtatási mechanizmus a C++ nyelvben C++ nyelvben Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék
28

Származtatási mechanizmus a C++ nyelvben

Jan 23, 2016

Download

Documents

yestin

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 Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Származtatási mechanizmus a C++ nyelvben

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

Page 2: Származtatási mechanizmus a C++ nyelvben

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

Page 3: Származtatási mechanizmus a C++ nyelvben

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)

Page 4: Származtatási mechanizmus a C++ nyelvben

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

Page 5: Származtatási mechanizmus a C++ nyelvben

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.

Page 6: Származtatási mechanizmus a C++ nyelvben

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

Page 7: Származtatási mechanizmus a C++ nyelvben

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

};

Page 8: Származtatási mechanizmus a C++ nyelvben

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

};

Page 9: Származtatási mechanizmus a C++ nyelvben

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ő!!!};

Page 10: Származtatási mechanizmus a C++ nyelvben

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";

 

Page 11: Származtatási mechanizmus a C++ nyelvben

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

Page 12: Származtatási mechanizmus a C++ nyelvben

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";

Page 13: Származtatási mechanizmus a C++ nyelvben

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

Page 14: Származtatási mechanizmus a C++ nyelvben

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";

}

Page 15: Származtatási mechanizmus a C++ nyelvben

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

Page 16: Származtatási mechanizmus a C++ nyelvben

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!

Page 17: Származtatási mechanizmus a C++ nyelvben

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ő

Page 18: Származtatási mechanizmus a C++ nyelvben

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.

Page 19: Származtatási mechanizmus a C++ nyelvben

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

};

Page 20: Származtatási mechanizmus a C++ nyelvben

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

}

};

Page 21: Származtatási mechanizmus a C++ nyelvben

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ú!}

Page 22: Származtatási mechanizmus a C++ nyelvben

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

Page 23: Származtatási mechanizmus a C++ nyelvben

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

Page 24: Származtatási mechanizmus a C++ nyelvben

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.

Page 25: Származtatási mechanizmus a C++ nyelvben

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

Page 26: Származtatási mechanizmus a C++ nyelvben

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

Page 27: Származtatási mechanizmus a C++ nyelvben

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

};

Page 28: Származtatási mechanizmus a C++ nyelvben

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";

}