15.3. El problema

El problema con Instrument2.cpp puede verse al ejecutar el programa. La salida es Instrument::play. Claramente, esta no es la salida deseada, porque el objeto es actualmente un Wind y no solo un Instrument. La llamada debería producir un Wind::play. Por este motivo, cualquier objeto de una clase que derive de la clase Instrument debería usar su propia versión de play(), de acuerdo a la situación.

El comportamiento de Instrument2.cpp no es sorprendente dada la aproximación de C a las funciones. Para entender el resultado es necesario comprender el concepto de binding (ligadura).

15.3.1. Ligadura de las llamadas a funciones

Conectar una llamada a una función al cuerpo de la función se conoce como binding (vincular). Cuando la vinculación se realiza antes de ejecutar el programa (por el compilador y el linker), se la conoce como early binding (ligadura temprana). Puede no haber escuchado anteriormente este término debido a que no es posible con los lenguajes procedurales: los compiladores de C sólo admiten un tipo de vinculación que es la vinculación anticipada.

El problema en el programa anterior es causado por la vinculación anticipada porque el compilador no conoce la correcta función a la que debería llamar cuando sólo es una dirección de Instrument.

La solución se conoce como ligadura tardía (late binding), que significa que la ligadura se produce en tiempo de ejecución basándose en el tipo de objeto. También es conocida como ligadura dinámica o ligadura en tiempo de ejecución. Cuando un lenguaje implementa la ligadura dinámica debe existir algún tipo de mecanismo para determinar el tipo del objeto en tiempo de ejecución y llamar a la función miembro apropiada. En el caso de un lenguaje compilado, el compilador todavía no conoce el tipo actual del objeto, pero inserta código que lo averigua y llama al cuerpo correcto de la función. El mecanismo de la ligadura dinámica varía de un lenguaje a otro, pero se puede imaginar que algún tipo de información debe ser introducida en los objetos. Se verá como trabaja posteriormente.