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.
virtual
é desnecessário, mas não "machuca". Você pode explicar por que você acha que não deve ser usado nesse contexto?Respostas:
É um downcast: veja o artigo da Wikipedia sobre ele.
fonte
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.
fonte
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.
fonte