Valaki eltudná magyarázni mire jó a dynamic cast c++-ban?
Ok, tudom, hogy google, de sajnos én csak németet tanultam, így "megvagyok" lőve mikor azt mondják, hogy a legjobb források angolul vannak.
Nemrég kezdtem el angolul tanulni, de még nem értem az olyan szövegeket, mint ez:
Csak a kódokból tudnék következtetni.
Kár, és tanulj is, mert anélkül is lehet, csak nem érdemes.
A fent lévő cucc szabad fordítása röviden:
A dynamic casttal objektumokra mutató pointereket tudsz castolni egymássá. Upcastnál ehhez kb semmi sem kell, olyan, mint az implicit cast (A Dog az egy Animal, tehát bármikor kezelheted Animalként, szintaktikailag legalábbis).
Animal *a = new Dog(); // implicit
Animal *a = dynamic_cast<Animal*>(new Dog()); // dynamic, de elvileg ugyanaz kell, hogy történjen
A downcasting érdekesebb, ahhoz kell RTTI ("futásideji típus-információ", pföj), tehát lényegében ha van egy "a" nevű Animal objektumod (pointered), akkor runtime ki lehet deríteni, hogy tudod-e kutyává castolni, vagy az egy macska.
// implicit upcast, lehetne dynamic is, de itt minek
// (persze ha módosul a kód, és a Cat többé nem Animal leszármazott, akkor ugye..)
Animal * a = new Cat();
Dog *d = dynamic_cast<Dog*>(a); // null pointer lesz a d, ha jól tévedek
Dog *D = (Dog*)a; // bónusz feladat ezt kipróbálnod :O
Igyekszem tömör lenni.
Adva van egy ősosztályod, amelynek van legalább egy kiterjesztett osztálya. (C# példa)
class Butor {
.. public string Alapanyag;
.. public string Szin;
}
class Szek : Butor {
.. public int LabakSzama;
.. public bool Hattamlas;
}
Figyeld meg, hogy az öröklődés a mi világunkhoz hasonló viszonyt ír le az osztályok között. Minden szék bútor, de nem minden bútor szék.
Ezért megtehetek ilyet, mivel egy szék minden olyan dolgot tud, amit egy bútornak tudnia kell:
Butor b = new Szek();
Viszont ilyet már nem tehetek meg:
Szek sz = new Butor();
Ugyanis egy bútor nem tud mindent, amit egy széknek tudnia kell.
Itt bejön két lényeges fogalom:
Statikus típus: Ez lényegében azt jelenti, hogy milyen típusú az adott kifejezésem (pl. milyen típusú a változóm)
Dinamikus típus: Az a dolog valójában micsoda.
Visszatérve erre a példára:
Butor b = new Szek();
A "b" statikus típusa Butor, míg a dinamikus típusa Szek. Így típuskényszerítéssel (kasztolással) ezt a b példányt kezelhetem Szek-ként:
(Szek)b;
A típuskényszerítés nem más, mint a statikus típus megváltoztatása. Így ennek a (Szek)b kifejezésnek mind a statikus, mind a dinamikus típusa Szek lesz.
Ezt csinálja a dynamic_cast is C++-ban.
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!