Was ist Upcasting / Downcasting?

16

Wenn man etwas über Polymorphismus lernt, sieht man normalerweise so etwas

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

Was ist Upcasting oder Downcasting? Ist (Derived*)base_ptr;ein Upcast oder Downcast?

Ich nenne es verärgert, weil Sie von der Basis weg in etwas Spezifischeres gehen. Andere Leute sagten mir, dass es ein Downcast ist, weil Sie eine Hierarchie in etwas Bestimmtes aufbauen, wobei die Spitze die Wurzel ist. Aber andere Leute scheinen es so zu nennen, wie ich es nenne.

Wenn ein Basis-PTR in einen abgeleiteten PTR konvertiert wird, spricht man von Upcasting oder Downcasting? und wenn jemand auf eine offizielle Quelle verlinken oder erklären kann, warum es so heißt, dann ist es großartig.


quelle
3
Verwandte: "Wer hat sich für die Terminologie Downcasting und Upcasting entschieden?" Eigentlich ... duplizieren?
Steven Jeuris
3
Es ist kein Duplikat. Diese Frage fragt, was es ist, die andere fragt, wer die Namen hat.
Robert Harvey
1
@RobertHarvey "und wenn jemand auf eine offizielle Quelle verlinken oder erklären kann, warum es so heißt, dann ist es großartig." , aber einverstanden, das könnte nur als Teil der Frage betrachtet werden.
Steven Jeuris
Achten Sie in der abgeleiteten Klasse auf diese virtuelle . Sie möchten das nicht schreiben, es sei denn, Sie leiten die abgeleitete Klasse noch einmal ab. void fn () {...} reicht aus.
14.
JustaPro: Hinzufügen virtualist unnötig, "schadet" aber nicht. Können Sie erläutern, warum Sie der Meinung sind, dass es in diesem Zusammenhang überhaupt nicht verwendet werden sollte?
Nik Bougalis

Antworten:

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

Es ist niedergeschlagen: siehe Wikipedia- Artikel dazu.

Bei der objektorientierten Programmierung ist Downcasting oder Typverfeinerung das Umwandeln einer Referenz einer Basisklasse in eine ihrer abgeleiteten Klassen.

In vielen Programmiersprachen ist es möglich, über RTTI zu überprüfen, ob der Typ des referenzierten Objekts tatsächlich der Typ ist, in den umgewandelt wird, oder ein abgeleiteter Typ, und daher einen Fehler auszugeben, wenn dies nicht der Fall ist.

Mit anderen Worten, wenn eine Variable der Basisklasse ( Elternklasse ) einen Wert der abgeleiteten Klasse ( Kindklasse ) hat, ist Downcasting möglich ...

Robert Harvey
quelle
9

In den meisten Sprachen werden (soweit ich weiß) Generalisierungen automatisch durchgeführt. Wenn Sie also in der Regel von einer Besetzung innerhalb einer Hierarchie sprechen, beziehen Sie sich auf eine spezialisierte Besetzung. Meiner Meinung nach bezeichnen die meisten Menschen mit dem Wunsch, die beiden Typen zu trennen, die spezialisierte Besetzung als niedergeschlagen, da sie die Vererbungshierarchie als einen Baum betrachten. Und in der Informatik ist die Wurzel oben abgebildet. Der Grund dafür ist entweder eine Konvention oder wahrscheinlich ein tief verwurzelter Hass auf Biologen unter Informatikern. (Alle Wortspiele vorgesehen.)

EDIT: Vielleicht ist es ein Top-Hass verwurzelt.

Narbenkühlschrank
quelle
LOL muss +1 :).
2

Stellen Sie sich die normale Art vor, einen Baum mit der "Basis" oben auf der Seite und den Blättern unten zu zeichnen. Wenn Sie Ihre Klassenhierarchie auf diese Weise darstellen, mit der Basisklasse oben und den Blättern irgendwo darunter, wird das Hoch- und Runterwerfen zu einem wörtlichen Vorgang. Besetzung und etwas, das die Seite von der Basis zu einem Blatt hinunterbewegt, ist eine Herabbesetzung.

Jerry Sarg
quelle
2
Aber Bäume gehen nach oben und ihre Stämme stehen auf dem Boden und ragen aus dem Boden. (Deshalb denke ich immer wieder verärgert)
@ acidzombie24: Aber in Büchern über Informatik werden Sie feststellen, dass Bäume normalerweise so gezeichnet werden, wie ich es beschrieben habe, mit der Wurzel oben.
Jerry Coffin
Ich weiß, aber ich war nur lustig. Bäume (echte) und Basen (wie Fundamente und unter meinen Füßen) sind so schlechte
5
@ acidzombie24: Stell sie dir als Bäume in Australien vor.
Martin York