C++ programozási nyelv Gyakorlat - 9. hét
Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet Soós Sándor 2004. november
A C++ programozási nyelv
Soós Sándor
1/15
Tartalomjegyzék ● ● ● ● ● ● ● ●
Hozzáférési kategóriák öröklés nélkül Hozzáférési kategóriák és az öröklés Protected hozzáférési kategória Példa protected hozzáférésre A protected hozzáférés nem osztályszintű Adatok örököltetése 1. Adatok örököltetése 2. Önhivatkozó struktúra
A C++ programozási nyelv
Soós Sándor
2/15
Bemelegítő, ismétlő kérdés ●
●
Adott a következő függvény deklaráció: – void f( Szemely & Par) Igaz-e, hogy ezt a függvényt Szemely típusú paraméterrel kell meghívni?
A C++ programozási nyelv
Soós Sándor
3/15
Bevezetés ●
●
Eddig úgy vizsgáltuk az öröklődést, hogy minden tag public hozzáférésű volt. Most megvizsgáljuk, hogy miképpen befolyásolják az öröklődést a különböző hozzáférési kategóriák.
A C++ programozási nyelv
Soós Sándor
4/15
Hozzáférési kategóriák öröklés nélkül ●
Vizsgáljuk meg a következő programot!
class Szemely{ public: void SzPub1() { printf("SzPub1\n"); SzPriv1(); } private: void SzPriv1() { printf("SzPriv1\n");} }; int main() { Szemely sz; sz.SzPub1(); sz.SzPriv1(); return 0; } A C++ programozási nyelv
Mi helyes, és mi nem ebben a programban?
Soós Sándor
5/15
Hozzáférési kategóriák öröklés nélkül ●
Vizsgáljuk meg a következő programot!
class Szemely { public: virtual void SzPub() { printf( "SzPub\n" ); SzPriv(); } virtual SzPub2( Szemely & masik ) { masik.SzPriv(); } private: virtual void SzPriv() { printf( "SzPriv\n"); } }; int main() { Szemely sz, sz2; Mi helyes, és mi nem sz.SzPub(); ebben a programban? sz.SzPub2( sz2 ); sz.SzPriv(); return 0; }; A C++ programozási nyelv
Soós Sándor
6/15
Hozzáférési kategóriák és az öröklés ●
Az előző dián látott Szemely osztályból örökítsük a következőt:
class Diak : public Szemely { public: void DPub1() { printf( "DPub1\n" );} }; int main() { Szemely sz; Diak d1, d2; sz.SzPub2( d1 ); d1.SzPub2( sz ); d1.SzPub2( d2 ); d1.DPub1(); sz.DPub1();
Mi helyes, és mi nem ebben a programban?
} A C++ programozási nyelv
Soós Sándor
7/15
Hozzáférési kategóriák és az öröklés, folyt. ●
Most definiáljuk a DPub1()-et a következőképpen:
class Diak : public Szemely { public: void DPub1() { SzPriv(); } };
Mi helyes, és mi nem ebben a programban?
A C++ programozási nyelv
Soós Sándor
8/15
Protected hozzáférési kategória ●
●
●
●
Vannak olyan esetek, hogy az osztály bizonyos részeit szeretnénk elrejteni a külvilág elől, de meg szeretnénk nyitni a leszármazottak előtt. Erre szolgál a protected hozzáférési kategória. – Az adott osztály metódusai és a leszármazottak látják – A külvilág viszont nem A hozzáférési kategóriák "szigorúsági" sorrendje: – public – protected – private Az osztály definíciójában nem kötelező ilyen sorrendet tartani!
A C++ programozási nyelv
Soós Sándor
9/15
Példa protected hozzáférésre class Szemely { public: virtual void SzPub1() { SzProt1(); } // OK protected: virtual void SzProt1() { printf( "SzProt1\n" ); } int main() { Szemely sz; sz.SzPub1(); sz.SzProt1(); return 0; } A C++ programozási nyelv
// OK // Hibás
Soós Sándor
10/15
Példa protected hozzáférésre, folyt. class Diak : public Szemely { public: void DPub1() { SzProt1(); } // ez megy! }; – ●
A Diak felül is definiálhatja az SzProt1-et.
Nem ajánlatos megváltoztatni utólag egy protected metódust, ugyanúgy, ahogyan egy public-ot sem! – mert engedélyeztük, hogy a leszármazottak felhasználják – csak a private hozzáférés esetén garantált, hogy azt rajtunk kívül senki nem fogja felhasználni.
A C++ programozási nyelv
Soós Sándor
11/15
A protected hozzáférés nem osztályszintű ●
A protected hozzáférés nem osztályszintű, hanem példányszintű, azaz a gyerek csak a szülője protected tagjaihoz fér hozzá más példányokéhoz nem! class Szemely { public: virtual void SzPub1( Szemely & masik ); { masik.SzProt1(); } protected: virtual void SzProt1() { printf( "SzProt1\n" ); // OK } class Diak : public Szemely { public: void DPub1( Szemely & masik) { masik.SzProt1(); } };
A C++ programozási nyelv
Soós Sándor
// ez nem megy!
12/15
Adatok örököltetése 1. ●
Nézzük meg a következő programot:
●
class Szemely{ public: Szemely() { X = 10; } int X; }; class Diak : public Szemely{ public: Diak() { X = 20; } };
int main() { Szemely sz; printf("%d\n",sz.X); Diak d; printf("%d\n",d.X); return 0; }
Mit ír ki?
A C++ programozási nyelv
Soós Sándor
13/15
Adatok örököltetése 2. ●
Nézzük meg a következő programot: class Szemely { public: Szemely() { X = 10; } int X; } class Diak : public Szemely { public: Diak() { X = 20; Szemely::X=50; } int X; };
A C++ programozási nyelv
Soós Sándor
int main() { Szemely sz; printf( "%d\n", sz.X ); Diak d; printf( "%d %d\n", d.X, d.Szemely::X ); return 0; }
Mit ír ki? 14/15
Önhivatkozó struktúra ●
Előzetes a jövő óráról class Szemely { public: int Azonosito; Szemely* kovetkezo; }
●
C++ -ban nem kell előre deklarálni, ahogyan a C-ben
A C++ programozási nyelv
Soós Sándor
15/15