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).