2011-05-11 17 views
6

Supongamos que tengo dos clases A y B. B deriva de A. A no tiene miembros de datos, sin embargo, B tiene dos miembros enteros.C++: copiar datos de objetos en la función miembro de la clase base

Si defino un método en la clase A, como la siguiente:

void CopyFrom(const A* other) 
{ 
    *this = *other; 
} 

y lo llaman en la clase del niño, será el miembro de datos entero se copian?

+0

Creo que no se copiarán, pero me gustaría escuchar una respuesta correcta también. –

Respuesta

7

No. Esto se conoce como slicing problem.

Esto es cierto incluso si sobrecarga operator= tanto en A y B: *this = *other referida solamente a resolver A::operator=(const A&) o B::operator=(const A&) ser llamado.

+0

cómo solucionarlo? Echarlo antes de usar? – atoMerz

+0

@AtoMerZ: depende de lo que intenta hacer. Si alguna vez te encuentras en una situación en la que tienes una 'A *' que apunta a una 'B', y quieres' CopyFrom' otra 'B', ¡entonces probablemente estés haciendo algo mal! –

+1

@AtoMerZ: [esta respuesta] (http://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c/274977#274977) a la pregunta vinculada ofrece la mejor solución. – Johnsyweb

3

No. this no tiene espacio para miembros de la clase infantil. Entonces los miembros de la clase Derived serán cortados. Este problema se llama Object Slicing.

¿Cómo resolverlo?
¡Prevenir es mejor que curar!

No introduzca el código en una situación en la que Object Slicing se produce.
Si enfrenta el problema de Object Slicing, tiene un programa de software mal diseñado/diseñado. A menos que, por supuesto, esté sacrificando un buen diseño de OOP a favor de la conveniencia.

Cuestiones relacionadas