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{ void SzPub1() { printf("szpub1\n"); SzPriv1(); private: void SzPriv1() { printf("szpriv1\n"); int main() { Szemely sz; sz.szpub1(); sz.szpriv1(); return 0; Mi helyes, és mi nem ebben a programban? A C++ programozási nyelv 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 { 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; sz.szpub(); sz.szpub2( sz2 ); sz.szpriv(); return 0; Mi helyes, és mi nem ebben a programban? 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 { 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 { 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 { virtual void SzPub1() { SzProt1(); // OK protected: virtual void SzProt1() { printf( "SzProt1\n" ); int main() { Szemely sz; sz.szpub1(); sz.szprot1(); return 0; // OK // Hibás A C++ programozási nyelv Soós Sándor 10/15
Példa protected hozzáférésre, folyt. class Diak : public Szemely { 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 { virtual void SzPub1( Szemely & masik ); { masik.szprot1(); protected: virtual void SzProt1() { printf( "SzProt1\n" ); // OK class Diak : public Szemely { void DPub1( Szemely & masik) { masik.szprot1(); // ez nem megy! A C++ programozási nyelv Soós Sándor 12/15
Adatok örököltetése 1. Nézzük meg a következő programot: class Szemely{ Szemely() { X = 10; int X; class Diak : public Szemely{ 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 { Szemely() { X = 10; int X; class Diak : public Szemely { Diak() { X = 20; Szemely::X=50; int X; 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? A C++ programozási nyelv Soós Sándor 14/15
Önhivatkozó struktúra Előzetes a jövő óráról class Szemely { 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