Che cos'è l'upcasting / downcasting?


16

Quando impari sul polimorfismo, comunemente vedi qualcosa del genere

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

Che cos'è l'upgrade o il downcast? È (Derived*)base_ptr;un upcast o un downcast?

Lo chiamo upcast perché stai andando lontano dalla base in qualcosa di più specifico. Altre persone mi hanno detto che è un downcast perché stai scendendo in una gerarchia in qualcosa di specifico con il top come root. Ma altre persone sembrano chiamarlo come lo chiamo io.

Quando si converte un ptr di base in un ptr derivato si chiama upcasting o downcasting? e se qualcuno può collegarsi a una fonte ufficiale o spiegare perché si chiama così bene.



3
Non è un duplicato. Questa domanda pone di cosa si tratta, l'altra chiede chi ha inventato i nomi.
Robert Harvey,

1
@RobertHarvey "e se qualcuno può collegarsi a una fonte ufficiale o spiegare perché si chiama così bene." , ma concordato, ciò potrebbe essere considerato solo una parte della domanda.
Steven Jeuris,

fai attenzione a quello virtuale nella classe Derived. Non vuoi scriverlo a meno che tu non derivi ancora una volta la classe Derivata. void fn () {...} è abbastanza.
Appoll

JustaPro: l'aggiunta virtualnon è necessaria ma non "fa male". Puoi approfondire il motivo per cui pensi che non dovrebbe essere usato affatto in quel contesto?
Nik Bougalis,

Risposte:


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

È un downcast: vedi l' articolo di Wikipedia su di esso.

Nella programmazione orientata agli oggetti , il downcast o il raffinamento del tipo è l'atto di trasmettere un riferimento di una classe base a una delle sue classi derivate.

In molti linguaggi di programmazione, è possibile verificare tramite RTTI se il tipo di oggetto referenziato è effettivamente quello su cui viene eseguito il cast o un tipo derivato di esso, e quindi emettere un errore se non è così.

In altre parole, quando una variabile della classe base (classe genitore ) ha un valore della classe derivata ( classe figlio ), è possibile il downcasting ...


9

Nella maggior parte delle lingue (per quanto ne so) la generalizzazione dei cast viene eseguita automaticamente. Quindi, di solito se parli di un cast all'interno di una gerarchia ti riferisci a un cast specializzato. IMHO la maggior parte delle persone con il desiderio di separare i due tipi chiama il cast specialistico abbattuto perché pensano alla gerarchia dell'eredità come un albero. E nell'informatica la radice è raffigurata in cima. La ragione di ciò è una convenzione o, molto probabilmente, un odio profondamente radicato per i biologi tra gli informatici. (Tutti i giochi di parole previsti.)

EDIT: forse è un odio radicato in alto.


LOL deve +1 :).

2

Pensa al modo normale di disegnare un albero con la "base" nella parte superiore della pagina e le foglie nella parte inferiore. Se rappresenti la tua gerarchia di classi in questo modo, con la classe base in alto e le foglie da qualche parte in basso, allora l'up-casting e il down-casting diventano letterali - qualcosa che si sposta su una pagina da una foglia verso la base è un up- cast e qualcosa che si sposta lungo la pagina dalla base verso una foglia è un down-cast.


2
Ma gli alberi vanno verso l'alto e i loro tronchi sono sul terreno che escono dal terreno. (Questo è il motivo per cui continuo a pensare upcast)

@ acidzombie24: Ma nei libri di informatica, troverai che gli alberi sono normalmente disegnati come ho descritto, con la radice in alto.
Jerry Coffin,

Lo so ma ero solo divertente. Gli alberi (quelli reali) e la base (come le fondamenta e sotto i miei piedi) sono modi così cattivi di pensarci :(. +1

5
@ acidzombie24: pensali come alberi in Australia.
Martin York,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.