Что такое upcasting / downcasting?

16

Когда вы узнаете о полиморфизме, вы обычно видите что-то вроде этого

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

Что такое upcasting или downcasting? Является (Derived*)base_ptr;ли upcast или downcast?

Я называю это унылым, потому что вы уходите с базы во что-то более конкретное. Другие люди говорили мне, что это уныло, потому что вы идете вниз по иерархии к чему-то конкретному, а вершина является корнем. Но другие люди, кажется, называют это так, как я это называю.

При преобразовании базового ptr в производный ptr это называется upcasting или downcasting? и если кто-то может сослаться на официальный источник или объяснить, почему его так называют, чем здорово.


источник
3
По теме: «Кто определился с терминологией даункинг и апскейтинг?» На самом деле ... дублировать?
Стивен Джеурис
3
Это не дубликат. Этот вопрос спрашивает, что это, другой спрашивает, кто придумал имена.
Роберт Харви
1
@RobertHarvey "и если кто-то может сослаться на официальный источник или объяснить, почему его так называют, это здорово". , но согласился, что это можно рассматривать только как часть вопроса.
Стивен Джеурис
следите за этим виртуальным в классе Derived. Вы не хотите писать это, пока не получите производный класс еще раз. void fn () {...} достаточно.
апреля
JustaPro: добавление virtualненужно, но не «больно». Можете ли вы уточнить, почему вы считаете, что его вообще не следует использовать в этом контексте?
Ник Бугалис

Ответы:

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

Это уныло: см. Статью в Википедии .

В объектно-ориентированном программировании , понижающее приведение или типа уточнение актого литья ссылки базового класса к одному из его производных классов.

Во многих языках программирования с помощью RTTI можно проверить , является ли тип ссылочного объекта действительно объектом, к которому производится преобразование, или производным типом, и, таким образом, выдать ошибку, если это не так.

Другими словами, когда переменная базового класса ( родительский класс ) имеет значение производного класса ( дочерний класс ), возможен переход на более низкий уровень ...

Роберт Харви
источник
9

На большинстве языков (насколько я знаю) обобщающие приведения выполняются автоматически. Так, обычно, если вы говорите о приведении в иерархии, вы имеете в виду специализированный состав. ИМХО большинство людей, желающих разделить два типа, называют специализированное приведение в нисходящее состояние, потому что они думают об иерархии наследования как о дереве. А в информатике корень изображен на вершине. Причиной этого является либо соглашение, либо, что более вероятно, глубокая ненависть к биологам среди ученых-компьютерщиков. (Все каламбуры предназначены.)

РЕДАКТИРОВАТЬ: Может быть, это первородная ненависть.

scarfridge
источник
LOL должен +1 :).
2

Подумайте о том, как можно нарисовать дерево с «основанием» вверху страницы и листьями внизу. Если вы представляете свою иерархию классов таким образом, с базовым классом наверху и листьями где-то внизу, то повышение и понижение становятся буквальными - то, что перемещает страницу вверх от листа к основанию, является повышением. приведение и то, что движется вниз по странице от основания к листу, является понижением.

Джерри Гроб
источник
2
Но деревья идут вверх, а их стволы на земле выходят из почвы. (Вот почему я продолжаю думать, upcast)
@ acidzombie24: Но в книгах по информатике вы обнаружите, что деревья обычно рисуются, как я описал, с корнем вверху.
Джерри Коффин
Я знаю, но я был просто смешным. Деревья (настоящие) и основание (например, основание и у меня под ногами) такие плохие способы думать об этом :(. +1
5
@ acidzombie24: Просто думай о них, как о деревьях в Австралии.
Мартин Йорк,