Ficsor Lajos CPP6 / 1 Virtuális bázisosztály Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék
Ficsor Lajos Virtuális bázisosztály CPP6 / 2 Többszörösen örökölt bázisosztály Egy osztály származtatási listájában csak egyszer szerepelhet egy bázisosztály Ennek ellenére a többszörös öröklődés lehetősége miatt egy bázisosztály többször is előfordulhat egy leszármazott osztályban. Egyszerű példa: "gyémánt" öröklési szerkezet
Ficsor Lajos Virtuális bázisosztály CPP6 / 3 Példa Egy fuvarozó vállalkozó járművei:
Ficsor Lajos Virtuális bázisosztály CPP6 / 4 Példa (folyt.) A járműszerelvény modellje:
Ficsor Lajos Virtuális bázisosztály CPP6 / 5 Példa (folyt.) A teljes osztálydiagram:
Ficsor Lajos Virtuális bázisosztály CPP6 / 6 Egy szerelvény objektum szerkezete Tulajdonos rész Teherautó saját rész Pótkocsi saját rész Szerelvény saját rész Tulajdonos rész Tulajdonos Teherauto Potkocsi Tulajdonos Szerelvény
Ficsor Lajos Virtuális bázisosztály CPP6 / 7 Felmerülő kérdések A tulajdonos rész kétszer épül be az objektumba. Szemantikailag indokolt-e? Jelen példánkban nem indokolt => fölösleges helyfoglalás Kétértelmű hivatkozás - feloldható a SCOPE operátorral A nev vagy Tulajdonos::nev azonosító kétértelmű A Teherauto::nev vagy Potkocsi::nev egyértelmű
Ficsor Lajos Virtuális bázisosztály CPP6 / 8 Virtuális bázisosztály Ha szemantikailag nem indokolt az ismétlődés: virtuális bázisosztály Előírása: a virtual kulcssszó az öröklődés módját előíró kulcssszó előtt. Példa: class Tulajdonos {…}; class Teherauto: virtual public Tulajdonos {…}; class Potkocsi: virtual public Tulajdonos {…}; class Szerelveny: public Teherauto, public Potkocsi {…};
Ficsor Lajos Virtuális bázisosztály CPP6 / 9 Virtuális öröklődés implementálása A virtuális bázisosztályból egy (megosztva használt) objektum keletkezik valamennyi leszármazott osztály számára. Az osztott objektum nem érhető el közvetlenül. A virtuális bázisosztály tagjaira bármely leszármazott osztály objektuma hivatkozhat. Az egyes leszármazott osztályok az osztott objektumot pointeren keresztül érik el.
Ficsor Lajos Virtuális bázisosztály CPP6 / 10 Virtuális öröklődés implementálása (példa) Pointer Teherautó saját rész Pótkocsi saját rész Szerelvény saját rész Tulajdonos Teherauto Potkocsi Tulajdonos Szerelvény Pointer Tulajdonos rész
Ficsor Lajos Virtuális bázisosztály CPP6 / 11 Virtuális bázisosztály konstruktora Először mindig a virtuális bázisosztály konstruktora hajtódik végre. Mindig az utolsó leszármazott osztály inicializálhatja a virtuális bázisosztályt. Ezért az ilyen leszármazott - kivételesen - nem csak a közvetlen ősét inicializálhatja! Példa: Szerelveny::Szerelveny(...) : Tulajdonos(...) {…}