Применение UpCast и DownCast

148
11 ноября 2019, 02:20

Downcast, насколько я понял, это явное приведения типов между собой. Тут вроде понятно, нужно приобразовать к другому типу, пожалуйста, для это и придуман Downcast. А для чего нужен upcast? И вообще зачем к указателю на базовый класс присваивать сслыку на дочерний? Для каких целей это делается?

Answer 1

И вообще зачем к указателю на базовый класс присваивать сслыку на дочерний?

Если речь идет об указателях на объекты, то для полиморфной работы.

struct Base{ virtual void foo() = 0; }
struct Der1 : Base{ /*переопределение foo*/ }
struct Der2 : Base{ /*переопределение foo*/ }
vector< Base* > v;
v.push_back( new Der1() );
v.push_back( new Der2() );
foreach( Base* p : v )
  p->foo();
Answer 2

Обычно, upcast - это признак ошибок в архитектуре, т.к. мы срезаем данные, относящиеся к ребенку. В некоторых случаях, это может логически разрушить объект. В случае с C++ с не полиморфным типом мы получим даже утечку памяти, т.к. не будет вызван деструктор ребенка.

Downcast проводит преобразование от отца к сыну. Приведение типов, находящиеся на одном уровне иерархии или вовсе не состоящие в родственных связях называется crosscast`ом.

READ ALSO
Путь с свойству с помощью рефлексии C#

Путь с свойству с помощью рефлексии C#

Есть массив объектов:

132
Быстрый Resize Bitmap C#

Быстрый Resize Bitmap C#

камрады!

129
Вывод всех элементов XElements

Вывод всех элементов XElements

Имею XML с сложной структурой (CommerceML) и нужно выпарсить некоторые значения оттуда

118
Roslyn ошибка сборки System.Runtime

Roslyn ошибка сборки System.Runtime

Коллеги, добрый день!

116