14.10.5. Una crisis

Por supuesto, cualquier upcast pierde información de tipo sobre el objeto. Si escribe

Wind w;
Instrument* ip = &w;

el compilador sólo puede tratar ip como un puntero a Instrument y nada más. Esto es, no puede saber que ip en realidad apunta a un objeto Wind. Así que cuando llame a la función miembro play() escribiendo

ip->play(middleC);

el compilador sólo puede saber que está llamando a play() a través de un puntero a Instrument, y llama a la versión de la clase base, Instrument::play(), en lugar de hacer lo que debería, que es llamar a Wind::play(). Así, no obtendrá el comportamiento correcto.

Éste es un problema importante; se resuelve en el Capítulo 15, que introduce el tercer pilar de la programación orientada a objetos: el polimorfismo (implementado en C++ con funciones virtuales).