Co to jest upcasting / downcasting?

16

Kiedy uczysz się o polimorfizmie, często widzisz coś takiego

class Base { int prv_member; virtual void fn(){} }
class Derived : Base { int more_data;  virtual void fn(){} }

Co to jest upcasting lub downcasting? Czy (Derived*)base_ptr;jest upcast lub downcast?

Nazywam to upcastem, ponieważ odchodzisz od bazy w coś bardziej szczegółowego. Inni ludzie mówili mi, że to przygnębienie, ponieważ schodzisz w dół hierarchii do czegoś konkretnego, a górna część jest korzeniem. Ale inni ludzie nazywają to tak, jak ja to nazywam.

Czy podczas konwersji podstawowego ptr na pochodną ptr nazywa się to upcastingiem lub downcastingiem? a jeśli ktoś może link do oficjalnego źródła lub wyjaśnić, dlaczego nazywa się tak, niż wspaniale.


źródło
3
Powiązane: „Kto zdecydował o terminologii downcasting i upcasting?” Właściwie ... duplikat?
Steven Jeuris
3
To nie jest duplikat. To pytanie pyta, co to jest, drugie pytanie, kto wymyślił imiona.
Robert Harvey
1
@RobertHarvey „i jeśli ktoś może link do oficjalnego źródła lub wyjaśnić, dlaczego nazywa się tak, niż wspaniale”. , ale zgodził się, że można to uznać za tylko część pytania.
Steven Jeuris
uważaj na tego wirtualnego w klasie Derived. Nie chcesz tego pisać, chyba że jeszcze raz wyprowadzisz klasę pochodną. void fn () {...} wystarczy.
appoll
JustaPro: dodawanie virtualjest niepotrzebne, ale nie „boli”. Czy możesz wyjaśnić, dlaczego Twoim zdaniem nie należy go w ogóle stosować w tym kontekście?
Nik Bougalis,

Odpowiedzi:

17
Is (Derived*)base_ptr; an upcast or downcast?

Jest przygnębiony: patrz Wikipedii artykuł na jej temat.

W programowaniu obiektowym , rzutowanie w dół lub typ dystynkcja jest aktem odlewania odwołanie od klasy podstawowej do jednej z jej klas pochodnych.

W wielu językach programowania możliwe jest sprawdzenie za pomocą RTTI, czy typ obiektu, do którego istnieje odwołanie, jest rzeczywiście tym, który jest rzutowany, czy też jego pochodnym typem, i w związku z tym wydaje błąd, jeśli tak nie jest.

Innymi słowy, gdy zmienna klasy podstawowej (klasa nadrzędna ) ma wartość klasy pochodnej ( klasa podrzędna ), możliwe jest downcasting ...

Robert Harvey
źródło
9

W większości języków (o ile mi wiadomo) generalizujące rzutowania są wykonywane automatycznie. Zwykle, jeśli mówisz o obsadzie w hierarchii, masz na myśli obsadę specjalizującą się. IMHO większość ludzi chcących rozdzielić dwa typy nazywa specjalizującą się obsadą, ponieważ uważają hierarchię dziedziczenia za drzewo. W informatyce korzeń jest na pierwszym miejscu. Powodem tego jest albo konwencja, albo, co bardziej prawdopodobne, głęboko zakorzeniona nienawiść do biologów wśród informatyków. (Wszystkie kalambury przeznaczone.)

EDYCJA: Może jest to głęboko zakorzeniona nienawiść.

szalik
źródło
LOL musi dać +1 :).
2

Pomyśl o zwykłym sposobie rysowania drzewa z „bazą” u góry strony i liśćmi u dołu. Jeśli w ten sposób reprezentujesz swoją hierarchię klas, z klasą podstawową na górze, a liście gdzieś poniżej, wówczas rzutowanie w górę i w dół staje się dosłowne - coś, co przesuwa stronę w górę od liścia w kierunku podstawy, jest rzut i coś, co przesuwa się w dół strony od podstawy w kierunku liścia, jest rzutem w dół.

Jerry Coffin
źródło
2
Ale drzewa idą w górę, a ich pnie wyrastają z ziemi. (Dlatego ciągle myślę, że
@ acidzombie24: Ale w książkach o informatyce zauważysz, że drzewa są zwykle rysowane tak, jak opisałem, z korzeniem na górze.
Jerry Coffin
Wiem, ale byłem zabawny. Drzewa (prawdziwe) i podstawa (jak fundament i pod moimi stopami) to takie złe sposoby, aby o tym myśleć :(. +1
5
@ acidzombie24: Pomyśl o nich jak o drzewach w Australii.
Martin York