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