C/Visual C - Conversión implicita de objetos

 
Vista:

Conversión implicita de objetos

Publicado por Luis (11 intervenciones) el 04/06/2002 18:32:39
Un objeto de la clase base puede ser inicializado con uno de la clase derivada sin más que asignarlo:
Base base1;
Derivada derivada1;
base1=derivada1;

No sé si puede hacerse la asignacion inversa, es decir, inicializar un objeto de la clase derivada con uno de la clase base. Sé que directamente no es posible, habría que hacer un cast. Pero aún haciendolo ¿se puede hacer siempre? ¿Sólo con punteros?
Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Conversión implicita de objetos

Publicado por chuidiang (677 intervenciones) el 04/06/2002 18:39:36
Puedes hacerlo con un cast explícito y el compilador te dejará aunque el objeto real no sea del tipo que tu pretendes. Eso luego te dará errores de ejecución gordos (una clase con sus atributos totalmente al azar).

Antes de hacer el cast debes estar muy seguro que el objeto realmente es la clase derivada a la que tu haces el cast.

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Conversión implicita de objetos

Publicado por claudio (22 intervenciones) el 04/06/2002 22:31:37
Como bien dijo chuidiang, lo que estás haciendo te puede dar resultados inesperados.

Lo que yo te aconsejo que hagas en cada clase un metodo de copia de objetos o una redefinicion del opera = para que quede más lindo tu código (en hambos casos tenes que copiar atributo por atributo).

Espero haber ayudado :-)}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

No entiendo chuidiang

Publicado por Luis (11 intervenciones) el 05/06/2002 09:46:32
He hecho un cast y me ha dado un error al ejecutarlo. Pero entonces si siempre da error ¿Para que se hace, nadie lo puede hacer porque da un error?. Tampoco entiendo tu última frase "Antes de hacer el cast debes estar muy seguro que el objeto realmente es la clase derivada a la que tu haces el cast". ¿Puedes aclararme?.
Gracias

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:No entiendo chuidiang

Publicado por chuidiang (677 intervenciones) el 05/06/2002 19:56:47
Cuando el cast es sin punteros, no estoy seguro si se puede o no hacer o si compila o no.

Si es con punteros, se puede hacer siempre cualquier cast (de cualquier clase a cualquier clase, aunque no tengan nada que ver). Lo que pasa es que el resultado no es bueno. Ejemplo
si tienes que A y B son clases que no tienen nada que ver la una con la otra y tienes
A *Instancia_A;
B *Instancia_B;
puedes hacer siempre
Instancia_A = (A *)Instancia_B;
y no te dará error en este momento (ni al compilar ni al ejecutar).
Sin embargo, cuando intentes ejecutar un método de Instancia_A puedes obtener cualquier cosa en tiempo de ejecución (resultados extraños, cuelgues del programa, etc).
Ese cast sólo sería válido si A es derivada de B y la instancia de B en realidad lo es de A.
Es decir
Instancia_B = new A(); // Esto es válido, puesto que A deriva de B
Instancia_A = (A *)Instacia_B; // Esto es válido ya que en realidad
// Instancia_B es una instancia de A
Si C también es derivada de B
Instancia_C = (C *)Instancia_B; // No es válido, ya que instancia_B en
// realidad es instancia de A, que no tiene
// nada que ver con C
Por ello, antes de hacer un cast, asegurate que la instancia es de la clase a la que quieres hacer cast.
Sigue en otro mensaje
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:No entiendo chuidiang

Publicado por chuidiang (677 intervenciones) el 05/06/2002 20:05:51
Continua del mensaje anterior.

Si necesitas hacer un cast entre clases que no tienen nada que ver, puedes redefirnir el operator cast. Sería algo así como

class A
{
public:
operator B (); // B es la clase a la que quieres hacer
// el cast
}

En el código haces el cast como mejor te convenga y devuelves una instancia de B. Es decir
A::operator B()
{
B Instancia_B;
//Relleno mi clase B como me interese con los datos de A
return B;
}

Esto te permite en adelante hacer
A Instancia_A;
B Instancia_B;
Instancia_B = (B)Instancia_A;

Se bueno
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar