O que é upcasting / downcasting?


16

Ao aprender sobre polimorfismo, você geralmente vê algo assim

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

O que é upcasting ou downcasting? É (Derived*)base_ptr;um upcast ou downcast?

Eu chamo de upcast porque você está saindo da base para algo mais específico. Outras pessoas me disseram que é um downcast porque você está descendo uma hierarquia para algo específico, com o topo sendo a raiz. Mas outras pessoas parecem chamar o que eu chamo.

Ao converter um ptr base em um ptr derivado, isso é chamado upcasting ou downcasting? e se alguém puder criar um link para uma fonte oficial ou explicar por que isso é chamado de ótimo.



3
Não é uma duplicata. Esta pergunta pergunta o que é, a outra pergunta quem apresentou os nomes.
Robert Harvey

1
@RobertHarvey "e se alguém puder criar um link para uma fonte oficial ou explicar por que chamou isso de ótimo." , mas concordou, isso poderia ser considerado apenas parte da pergunta.
Steven Jeuris

atente para esse virtual na classe Derived. Você não deseja escrever isso, a menos que derive a classe Derived mais uma vez. void fn () {...} é suficiente.
Appoll

JustaPro: adicionar virtualé desnecessário, mas não "machuca". Você pode explicar por que você acha que não deve ser usado nesse contexto?
Nik Bougalis

Respostas:


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

É um downcast: veja o artigo da Wikipedia sobre ele.

Na programação orientada a objetos , downcasting ou refinamento de tipo é o ato de converter uma referência de uma classe base em uma de suas classes derivadas.

Em muitas linguagens de programação, é possível verificar através do RTTI se o tipo do objeto referenciado é realmente aquele que está sendo convertido ou um tipo derivado e, assim, emitir um erro se não for o caso.

Em outras palavras, quando uma variável da classe base (classe pai ) tem um valor da classe derivada ( classe filho ), é possível fazer downcast ...


9

Na maioria dos idiomas (tanto quanto eu sei), as conversões generalizadas são executadas automaticamente. Portanto, geralmente se você fala sobre um elenco dentro de uma hierarquia, está se referindo a um elenco especializado. IMHO muitas pessoas com o desejo de separar os dois tipos chamam de cast downcast especializado, porque pensam na hierarquia de herança como uma árvore. E na ciência da computação, a raiz está na parte superior. A razão por trás disso é uma convenção ou, mais provavelmente, um ódio profundamente enraizado pelos biólogos entre os cientistas da computação. (Todos os trocadilhos pretendem.)

Edição: Talvez seja um ódio enraizado.


LOL deve marcar com +1 :).

2

Pense na maneira normal de desenhar uma árvore com a "base" na parte superior da página e as folhas na parte inferior. Se você representa sua hierarquia de classes dessa maneira, com a classe base no topo e as folhas em algum lugar abaixo, a conversão para cima e para baixo se torna literal - algo que move a página de uma folha para a base é uma elenco e algo que move a página da base em direção a uma folha é um elenco baixo.


2
Mas as árvores sobem e seus troncos estão no chão saindo do solo. (É por isso que eu continuo pensando upcast)

@ acidzombie24: Mas nos livros de ciência da computação, você verá que as árvores são normalmente desenhadas como eu descrevi, com a raiz no topo.
Jerry Coffin

Eu sei, mas eu estava apenas sendo engraçado. Árvores (reais) e base (como fundação e sob meus pés) são tão maus caminhos para pensar sobre isso :( +1.

5
@ acidzombie24: Pense nelas como árvores na Austrália.
Martin York
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.