¿Qué es upcasting / downcasting?

16

Cuando aprendes sobre el polimorfismo, comúnmente ves algo como esto

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

¿Qué es upcasting o downcasting? ¿Es (Derived*)base_ptr;un upcast o downcast?

Lo llamo upcast porque te vas de la base a algo más específico. Otras personas me dijeron que es abatido porque estás bajando de una jerarquía a algo específico, siendo la parte superior la raíz. Pero otras personas parecen llamarlo como yo lo llamo.

Al convertir un ptr base en un ptr derivado, ¿se llama upcasting o downcasting? y si alguien puede vincular a una fuente oficial o explicar por qué se llama así de genial.


fuente
3
Relacionado: "¿Quién decidió sobre la terminología downcasting y upcasting?" En realidad ... ¿duplicado?
Steven Jeuris
3
No es un duplicado. Esta pregunta pregunta qué es, la otra pregunta a quién se le ocurrieron los nombres.
Robert Harvey
1
@RobertHarvey "y si alguien puede vincular a una fuente oficial o explicar por qué se llama así de genial". , pero estuvo de acuerdo, eso podría considerarse solo como una parte de la pregunta.
Steven Jeuris
cuidado con eso virtual en la clase Derivada. No desea escribir eso a menos que derive la clase Derivada una vez más. void fn () {...} es suficiente.
appoll
JustaPro: agregar virtuales innecesario pero no "duele". ¿Puedes explicar por qué crees que no debería usarse en absoluto en ese contexto?
Nik Bougalis

Respuestas:

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

Es abatido: vea el artículo de Wikipedia sobre él.

En la programación orientada a objetos , el downcasting o el refinamiento de tipos es el acto de emitir una referencia de una clase base a una de sus clases derivadas.

En muchos lenguajes de programación, es posible verificar a través de RTTI si el tipo del objeto al que se hace referencia es el que se está convirtiendo o un tipo derivado del mismo, y así emitir un error si no es el caso.

En otras palabras, cuando una variable de la clase base (clase primaria ) tiene un valor de la clase derivada ( clase secundaria ), es posible el downcasting ...

Robert Harvey
fuente
9

En la mayoría de los idiomas (que yo sepa), los moldes de generalización se realizan automáticamente. Por lo tanto, por lo general, si habla de un elenco dentro de una jerarquía, se refiere a un elenco especializado. En mi humilde opinión, la mayoría de las personas con el deseo de separar los dos tipos llaman a la especialización rechazada porque piensan en la jerarquía de herencia como un árbol. Y en ciencias de la computación, la raíz se representa en la parte superior. La razón detrás de esto es una convención o, más probablemente, un profundo odio a los biólogos entre los informáticos. (Todos los juegos de palabras previstos).

EDITAR: Tal vez es un odio muy arraigado.

Scarfridge
fuente
LOL debe +1 :).
2

Piense en la forma normal de dibujar un árbol con la "base" en la parte superior de la página y las hojas en la parte inferior. Si representa su jerarquía de clases de esta manera, con la clase base en la parte superior y las hojas en algún lugar debajo, entonces la conversión ascendente y descendente se convierte en literal, algo que se mueve hacia arriba de la página desde una hoja hacia la base. cast y algo que se mueve hacia abajo de la página desde la base hacia una hoja es un down-cast.

Jerry Coffin
fuente
2
Pero los árboles van hacia arriba y sus troncos están en el suelo saliendo del suelo. (Es por eso que sigo pensando en lo alto)
@ acidzombie24: Pero en los libros de ciencias de la computación, encontrarás que los árboles se dibujan normalmente como lo he descrito, con la raíz en la parte superior.
Jerry Coffin
Lo sé pero solo estaba siendo gracioso. Los árboles (reales) y la base (como los cimientos y debajo de mis pies) son formas muy malas de pensar en ello :(. +1
55
@ acidzombie24: Piense en ellos como árboles en Australia.
Martin York