Qu'est-ce que l'upcasting / downcasting?

16

Lorsque vous découvrez le polymorphisme, vous voyez souvent quelque chose comme ça

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

Qu'est-ce que l'upcasting ou downcasting? Est-ce (Derived*)base_ptr;un upcast ou downcast?

Je l'appelle upcast parce que vous vous éloignez de la base pour quelque chose de plus spécifique. D'autres personnes m'ont dit que c'est un abattage parce que vous descendez une hiérarchie dans quelque chose de spécifique avec le sommet étant la racine. Mais d'autres semblent l'appeler comme je l'appelle.

Lors de la conversion d'un ptr de base en un ptr dérivé, est-il appelé upcasting ou downcasting? et si quelqu'un peut créer un lien vers une source officielle ou expliquer pourquoi cela s'appelle ça génial.


la source
3
Connexes: "Qui a décidé de la terminologie downcasting et upcasting?" En fait ... en double?
Steven Jeuris
3
Ce n'est pas un doublon. Cette question demande ce que c'est, l'autre demande qui est venu avec les noms.
Robert Harvey
1
@RobertHarvey "et si quelqu'un peut créer un lien vers une source officielle ou expliquer pourquoi son nom est si génial." , mais a convenu que cela ne pouvait être considéré que comme une partie de la question.
Steven Jeuris
attention à ce virtuel dans la classe Derived. Vous ne voulez pas écrire cela sauf si vous dérivez la classe Derived une fois de plus. void fn () {...} suffit.
apoll
JustaPro: l'ajout virtualest inutile mais ne fait pas "mal". Pouvez-vous expliquer pourquoi vous pensez qu'il ne devrait pas du tout être utilisé dans ce contexte?
Nik Bougalis

Réponses:

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

C'est un abattu: voir l' article de Wikipedia à ce sujet.

Dans la programmation orientée objet , la conversion descendante ou le raffinement de type est l'acte de transtyper une référence d'une classe de base en l'une de ses classes dérivées.

Dans de nombreux langages de programmation, il est possible de vérifier via RTTI si le type de l'objet référencé est bien celui qui est casté ou un type dérivé de celui-ci, et donc de générer une erreur si ce n'est pas le cas.

En d'autres termes, lorsqu'une variable de la classe de base (classe parent ) a une valeur de la classe dérivée ( classe enfant ), la descente est possible ...

Robert Harvey
la source
9

Dans la plupart des langues (pour autant que je sache), les généralisations généralisées sont effectuées automatiquement. Donc, généralement, si vous parlez d'une distribution au sein d'une hiérarchie, vous faites référence à une distribution spécialisée. À mon humble avis, la plupart des personnes désireuses de séparer les deux types appellent le casting spécialisé abattu parce qu'elles considèrent la hiérarchie d'héritage comme un arbre. Et en informatique, la racine est représentée comme étant au sommet. La raison derrière cela est soit une convention, soit, plus probablement, une haine profondément enracinée pour les biologistes parmi les informaticiens. (Tous les jeux de mots voulus.)

EDIT: C'est peut-être une haine enracinée au sommet.

écharpe
la source
LOL doit +1 :).
2

Pensez à la façon normale de dessiner un arbre avec la "base" en haut de la page et les feuilles en bas. Si vous représentez votre hiérarchie de classe de cette façon, avec la classe de base en haut et les feuilles quelque part en dessous, la conversion ascendante et descendante devient littérale - quelque chose qui remonte la page d'une feuille vers la base est cast et quelque chose qui se déplace vers le bas de la page de la base vers une feuille est un cast down.

Jerry Coffin
la source
2
Mais les arbres montent et leurs troncs sont au sol sortant du sol. (C'est pourquoi je continue de penser upcast)
@ acidzombie24: Mais dans les livres sur l'informatique, vous constaterez que les arbres sont normalement dessinés comme je l'ai décrit, avec la racine en haut.
Jerry Coffin
Je sais mais j'étais juste drôle. Les arbres (les vrais) et la base (comme la fondation et sous mes pieds) sont de si mauvaises façons de penser :(. +1
5
@ acidzombie24: Considérez-les comme des arbres en Australie.
Martin York