¿El pirateo de miembros privados es un comportamiento definido?
Tengo la siguiente clase:
class BritneySpears
{
public:
int getValue() { return m_value; };
private:
int m_value;
};
Que es una biblioteca externa (que no puedo cambiar). Obviamente no puedo cambiar el valor dem_value
, solo léelo. Incluso derivando deBritneySpears
no funciona
¿Qué pasa si defino la siguiente clase:
class AshtonKutcher
{
public:
int getValue() { return m_value; };
public:
int m_value;
};
Y luego hacer:
BritneySpears b;
// Here comes the ugly hack
AshtonKutcher* a = reinterpret_cast<AshtonKutcher*>(&b);
a->m_value = 17;
// Print out the value
std::cout << b.getValue() << std::endl;
Se que esto esmalo práctica. Pero solo por curiosidad:¿Está garantizado que esto funcione? ¿Es un comportamiento definido?
Pregunta extra: ¿Alguna vez has tenido que usar un truco tan feo?
Editar: solo para asustar a menos personas: no tengo la intención de hacer esto realmente enreal código. Sólo me pregunto ;)