¿Downcasting y Upcasting?
Posteado pormicromante | Guardado en Programacion | Con fecha 13-12-2009
Como se puede adivinar, desde el momento que existe algo conocido como upcasting (mover en sentido ascendente por una jerarquía de herencia) debe existir el downcasting (para mover en sentido descendente en una jerarquía). Pero el upcasting es sencillo porque al movernos en sentido ascendente en la jerarquía de clases siempre convergemos en clases más generales. Es decir, cuando se hace un upcast siempre se está en una clase claramente derivada de un ascendente (normalmente solo uno, excepto en el caso de herencia múltiple) pero cuando se hace downcast hay normalmente varias posibilidades a las que amoldarse.
Mas concretamente, un Circulo es un tipo de Figura (que sería su upcast), pero si se intenta hacer un downcast de una Figura podría ser un Circulo, un Cuadrado, un Triángulo, etc.
El problema es encontrar un modo seguro de hacer downcast (aunque es incluso más importante preguntarse por qué se está usando downcasting en vez de usar el polimorfismo para que adivine automáticamente el tipo correcto.
class Animal { public: virtual ~Animal(){}}
class Dog : public Animal{};
class Cat : public Animal{}; //Cdo se use dynamic_cast, hay que trabajar con una jerarquía polimórfica (con funciones virtuales) – debido a que el modeado dinámico usa información almacenada en la VTABLE para determinar el tipo actual. Aquí, la clase base contiene un destructor virtual y esto es suficiente
…
Pet* b = new Cat; // Upcast
Dog* d1 = dynamic_cast<Dog*>(b); // Try to cast it to Dog*: d1 con valor cero
Cat* d2 = dynamic_cast<Cat*>(b); // Try to cast it to Cat*: d2 con puntero a Cat* b
Para eso existe
Dynamic_cast<tipo> es mas lento y usa sobrecarga
Static_cast es mas rapido pero da error cdo eesta mal el cast
(tipo) este es el typecast es menos importante que el static_cast



