Downcast, насколько я понял, это явное приведения типов между собой. Тут вроде понятно, нужно приобразовать к другому типу, пожалуйста, для это и придуман Downcast. А для чего нужен upcast? И вообще зачем к указателю на базовый класс присваивать сслыку на дочерний? Для каких целей это делается?
И вообще зачем к указателю на базовый класс присваивать сслыку на дочерний?
Если речь идет об указателях на объекты, то для полиморфной работы.
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();
Обычно, upcast - это признак ошибок в архитектуре, т.к. мы срезаем данные, относящиеся к ребенку. В некоторых случаях, это может логически разрушить объект. В случае с C++ с не полиморфным типом мы получим даже утечку памяти, т.к. не будет вызван деструктор ребенка.
Downcast проводит преобразование от отца к сыну. Приведение типов, находящиеся на одном уровне иерархии или вовсе не состоящие в родственных связях называется crosscast`ом.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Имею XML с сложной структурой (CommerceML) и нужно выпарсить некоторые значения оттуда