Nem bírom ezt megérteni, hogyan értelmezzem?
Virtuális másoló konstruktorok
Ahogy korábban már említettük, a konstruktorok nem lehetnek virtuálisak. Ennek ellenére
vannak helyzetek, amikor programunk kétségbeesetten próbál beszuszakolni valahova
egy bázisosztálybeli objektumot címző mutatót, és próbálja megszerezni a létrejövő
származtatott objektum másolatát. Ennek a problémának jól bevált megoldása,
hogy egy másoló metódust hozunk létre a bázisosztályban, majd virtuálissá tesszük.
A másoló metódus létrehozza az aktuális objektum másolatát, és ezt adja vissza Visszatérési értékként.
Mivel minden származtatott osztály felülírja a másoló metódust, a származtatott osztályok
példányai jönnek létre.
Ezt az egészet nem értem pedig van hozzá példám is.
Nem tudom értelmezni fejben nincs hozzá agyam segítsetek.
Te vagy a cicás-emlősös b*zizó, mindenkit lehülyéző kedves kérdező?
Ha van példád is, akkor mit nem értesz rajta?
Az alap probléma, hogy hogy készítek másolatot egy objektumról, ha nem tudom a típusát? Nem tudom azt mondani, hogy new XY(objektum_amiről_másolni_akarok); mert nem tudom, mi az XY.
Erre megoldás, hogy minden osztály implementálja a Clone() virtuális függvényt, amiben annyit csinál, hogy lemásolja önmagát (hiszen ő pontosan tudja, mi az ő típusa), és visszaadja a másolatra mutató pointert.
Létrehozol egy függvényt.
Nem értem még mindig.
Miért van szükség erre az egészre.
"a származtató osztály konstruktora nem lehet virtuális, tehát lemásolja, még az ős osztályban, és virtuálissá teszi a másolatot, majd ez használható a származtatott osztályoknál"
Ennek semmi értelme. Függvényt nem tudsz lemásolni. Ha meg nem függvényről van szó, akkor azt meg nem tudod virtuálissá tenni.
Azért van szükség erre, mert ha van egy osztályhierarchiád:
class A {};
class B: public A {};
class C: public A {};
és van egy gyűjteményed A*-okból, amik vagy B, vagy C típusú objektumokra mutatnak, de nem tudod melyik melyik, és te szeretnél másolatot készíteni valamelyik objektumról, arra nincs triviális módszer.
Van egy A*-od, és szeretnél egy másik A*-ot, ami egy másolatára mutat az eredeti mutató által mutatott objektumnak.
iostream a te válaszodat megint nem értem de az előtted szólóét igen.
Nem rosszból :(
A konstruktor nem lehet virtuális, hiszen amikor konstruálsz egy new-val, akkor egyrészt a new kulcsszó mögé úgyis egy konkrét osztály nevét kell írnod, másrészt nincs is még objektum, aminek a metódusát meghívhatnád, tehát ha nincs objektum, nincs metódus és nincs minek virtuálisnak lennie. Ez nem baj, egész addig, amíg olyan objektumot kell létrehoznod, aminek nem tudod a konkrét típusát (fordítási időben), így nem is tudod new-val létrehozni.
Ha van egy objektumod és történetesen neked a másolatára lenne szükséged (mert tegyük föl, szaporodnak), akkor mit tennél egyszerű esetben? Létrehozol new-val egy újat, majd beállítod a belsejét/állapotát/attribútumait úgy, hogy pont a másolata legyen a másolandónak. Így már van kettő belőlük.
Na aztán mi van akkor, amikor a másolandó típusát nem ismered pontosan, max. csak azt, hogy egy adott ősosztály valami leszármazottja? Pl. Ha vannak Síkidom osztályod, amiből a Kör, meg a Négyzet leszármazik (hisz' mindkettő síkidom) és valaki copy-paste-tel másolni akar egy síkidomot. Amid van: egy referencia egy Síkidomra. Ami lehet Kör, Négyzet, Macika, akármi (hisz nem tudhatod, hogy később mi minden síkidomot definiálnak még). Azt viszont tudod, hogy másolni akarod, akármi is az. A new operátor ugrott, mivel fogalmad sincs, hogy mi a konkrét típusa, hogy beírhasd a new mögé.
Ekkor persze, buta módon csinálhatsz egy switch-case-t arra, hogy lekérdezd a másolandó síkidom típusát instanceof-fal (vagy bármi hasonló dologgal az adott nyelven) és az eredmény függvényében már tudod, hogy mit new-oljál.
Sokkal okosabb megoldás, ha minden síkidom oda tudja neked adni a másolatát, ahelyett, hogy te csinálnád meg. Ehhez kell egy virtuális metódus a síkidomba (hiszen most itt minden síkidomra kéred a másolás képességét). Miért virtuális? Mert a síkidom osztályban te nem mondod még meg, hogy hogyan is történjen a másolás (mivel nem is tudod), mert az attól függ, hogy melyik síkidomról van szó. A kör másolását a virtuális másoló metódusnak a Kör-ben lévő megvalósítása fogja adni, hasonlóan a Négyzetnél is. A Kör-ben lévő megvalósítás már tud new Kör-t csinálni, a Négyzet meg new Négyzet-et.
Tehát, ha van egy síkidomod és annak egy "másol" metódusa, ami egy másolat síkidommal tér vissza, akkor mi történik, ha meghívod? Tegyük föl, hogy a síkidomod valójában egy Kör. Ekkor, mivel a metódus virtuális, a Kör-ben lévő, kört másoló metódusimplementáció fog lefutni, ami létrehoz neked egy új Kör objektumot, majd visszaadja azt síkidomként (amit megtehet, hiszen minden Kör Síkidom is). Voilá! Van egy új Kör-öd, úgy, hogy nem tudod, hogy eredetileg egy körből lett másolva, meg azt sem, hogy ez egy Kör, csak azt hogy egy Síkidom.
Igen jó köszi .D
Akkora zöld kéz ment amekkorát még nem látott a gyík.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!