Eso mismo me planteba yo ( la vision de la clase en memoria) por eso preguntaba si si habia alguna manera de llamar al constructor de la clase B durante el casteo para construirla bien pero veo que no,ok.
Efectivamente no se puede. Los constructores son llamados únicamente al crear la clase... una vez que ya está creada los constructores no son invocados de nuevo. Además, tu piensa que las subclases, como norma general, necesitan más memoria que las superclases... y la memoria ha de ser secuencial. Una vez ya has hecho una reserva de memoria no puedes garantizar que una nueva reserva se realice inmediatamente después... luego no podrías crear correctamente la nueva clase.
Sin embargo ahora mi pregunta es que pasa si la superclase es abstracta. Supongamos que tengo una superclase A y dos que heredan C y D. Si defino un metodo que devuelve un puntero a A, si que puedo castear una superclase a una de sus clases derivadas sin problema. Esto es porq dentro del metodo he construido el objeto como una de laa clases derivadas ( necesariamente porque esabstracta) ¿correcto?
A ver, voy a intentar explicarlo con algo físico... para que sea más gráfico.
Tu imagínate que tienes la superclase Animal... y de ella heredan las clases Gato y Perro.
Si tu ( imagínate que eres una especie de dios ), creas un Gato... a ese gato lo puedes identificar como gato o como animal... pero nunca llegará a ser un perro ( tus poderes no dan para tanto ).
Si en vez de un gato creas un perro pasará exactamente lo mismo, el perro podrá ser tratado como un perro o como un animal, pero nunca como un gato.
El polimorfismo lo que te permite es tener punteros genéricos ( de tipo superclase ), que en realidad representen a entidades heredadas... pero este mecanismo no permite experimentos de mutación genética que permitan convertir un perro en un gato.
Si tu intentas llevar a cabo esta aberración de la naturaleza te pasará lo siguiente:
class Animal
{
};
class Perro: public Animal
{
};
class Gato : public Animal
{
};
void main( )
{
Animal* gato = new Gato( );
Animal* perro = new Perro( );
Gato* gato1 = dynamic_cast< Gato* >( gato ); // ok
Gato* gato2 = static_cast< Gato* >( gato ); // ok pero menos seguro
Perro* perro1 = dynamic_cast< Perro* >( perro ); // ok
Perro* perro2 = static_cast< Perro* >( perro ); // ok pero menos seguro
Gato* aberracion1 = dynamic_cast< Gato* >( perro ); // devuelve 0.
Gato* aberracion2 = static_cast< Gato* >( perro ); // funciona pero la aplicación va a dar resultados incorrectos o casques.
Perro* aberracion3 = dynamic_cast< Perro* >( gato); // devuelve 0.
Perro* aberracion4 = static_cast< Perro* >( gato); // te funciona pero la aplicación va a dar resultados incorrectos o casques.
}