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.



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 ...


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ść.


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ół.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.