UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 5. Gyakorlat Öröklődés, virtuális függvények, absztrakt osztályok
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Adattagok inicializálása Az adattagokat általában a konstruktorban szokás inicializálni. Egyik megoldás, amikor az inicializálást a konstruktor belsejében tesszük. Másik megoldás egy kicsit függvény szintaxist követ: private: int param_a; int param_b; public: Konstruktor( int a, int b ) : param_a(a), param_b(b){}
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Öröklődés Olyan osztályok között értelmezett viszony, amely segítségével egy általánosabb típusból (ősosztály) egy sajátosabb típust tudunk létrehozni (utódosztály). Az utódosztály adatokat és műveleteket viselkedésmódot örököl, kiegészíti ezeket saját adatokkal és műveletekkel, illetve felülírhat bizonyos műveleteket. A kód újrafelhasználásának egyik módja. Megkülönböztetünk egyszeres és többszörös örökítést.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Öröklődés Szintaxis: class ChildrenClass: visibility ParentClass{}; Gyerek osztály konstruktorában meg kell hívni az ős osztály konstruktorát a következőképpen: public: ChildrenClass( int param) : Parent( param){}
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Öröklődés Láthatóság használatával csak szigorítani lehet az öröklődést.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Többszörös öröklődés Nem egy, hanem több osztályból örököltetünk, szintaxis: ChildrenClass: visibility Parent1, visibility Parent2, … Gyerek konstruktorban meg kell hívni az ős osztályok konstuktorát: public: ChildrenClass( int param) : Parent1( param), Parent2( param), …
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Ős adattagok elérése Minden adattagot elérünk amit az ős osztálytól örököltünk (kivéve a private). Ezeket felül is definiálhatjuk. Ha már felüldefiniáltunk egy metódust, és a metódust az osztályon belül bármilyen prefix nélkül használjuk, akkor a felülírt metódus fog meghívódni. Viszont ha ilyen esetben az ős osztály metódusát szeretnénk használni, akkor meg kell adni az elérési útvonalat: ParentClass::methodName(params..);
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Virtuális függvények Tegyük fel, hogy egy ős osztálybeli pointerrel mutatunk egy gyerek osztálybeli objektumra. Tegyük fel, hogy a gyerek osztályban felüldefiniáltunk egy függvényt. Ha az ős pointeren keresztül meghívjuk ezt a függvényt, akkor nem a felüldefiniált fog meghívódni, hanem az ős osztályban létrehozott függvény. Példa: Basic* basic = new Child; basic->Function();//az ős metódusa fog meghívódni
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Virtuális függvények Ennek kiküszöbölésére találták ki a virtuális függvényeket. Minden olyan objektum, mely rendelkezik legalább egy virtuális függvénnyel, rendelkezik egy ú.n. virtuális ugró táblával, melyben a virtuális függvények ugrási címe szerepel. Ha hivatkozunk ősreferencián keresztül egy metódusra, ami virtuális, akkor a gyerek objektum ugró táblájából keresi ki a program a hívandó függvény címét.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Virtuális függvények Virtuális függvény létrehozásának szintaxisa: virtual visszatérési_típus függvénynév(paraméterek); Csak az ősosztályban kell kiírni a virtual szót.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Pure virtual függvények Arra is van lehetőség, hogy egy újonnan létrehozott virtuális függvényt az adott osztályban nem implementáljuk. Szintaxisa: virtual visszatérési_típus metódusnév() = 0;
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Absztrakt osztályok Ha egy osztály rendelkezik legalább egy pure virtual függvénnyel, akkor azt absztrakt osztálynak nevezzük. Absztrakt osztályból nem lehet objektumot képezni, csak pointer vagy referencia lehet.