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.
virtual
jest niepotrzebne, ale nie „boli”. Czy możesz wyjaśnić, dlaczego Twoim zdaniem nie należy go w ogóle stosować w tym kontekście?Odpowiedzi:
Jest przygnębiony: patrz Wikipedii artykuł na jej temat.
źródło
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ść.
źródło
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ół.
źródło