Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
✐<br />
✐<br />
✐<br />
“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 438 — #476<br />
✐<br />
Capítulo 15. Polimorfismo y Funciones virtuales<br />
La solución se conoce como ligadura tardía (late binding), que significa que la ligadura<br />
se produce <strong>en</strong> tiempo de ejecución basándose <strong>en</strong> el tipo de objeto. También<br />
es conocida como ligadura dinámica o ligadura <strong>en</strong> tiempo de ejecución. Cuando un l<strong>en</strong>guaje<br />
implem<strong>en</strong>ta la ligadura dinámica debe existir algún tipo de mecanismo para<br />
determinar el tipo del objeto <strong>en</strong> tiempo de ejecución y llamar a la función miembro<br />
apropiada. En el caso de un l<strong>en</strong>guaje compilado, el compilador todavía no conoce el<br />
tipo actual del objeto, pero inserta código que lo averigua y llama al cuerpo correcto<br />
de la función. El mecanismo de la ligadura dinámica varía de un l<strong>en</strong>guaje a otro,<br />
pero se puede imaginar que algún tipo de información debe ser introducida <strong>en</strong> los<br />
objetos. Se verá como trabaja posteriorm<strong>en</strong>te.<br />
15.4. Funciones virtuales<br />
Para que la ligadura dinámica t<strong>en</strong>ga efecto <strong>en</strong> una función particular, <strong>C++</strong> necesita<br />
que se use la palabra reservada virtual cuando se declara la función <strong>en</strong> la clase<br />
base. La ligadura <strong>en</strong> tiempo de ejecución funciona unícam<strong>en</strong>te con las funciones v-<br />
irtual es, y sólo cuando se está usando una dirección de la clase base donde exista<br />
la función virtual, aunque puede ser definida también <strong>en</strong> una clase base anterior.<br />
Para crear una función miembro como virtual, simplem<strong>en</strong>te hay que preceder<br />
a la declaración de la función con la palabra reservada virtual. Sólo la declaración<br />
necesita la palabra reservada virtual, y no la definición. Si una función es declarada<br />
como virtual, <strong>en</strong> la clase base, será <strong>en</strong>tonces virtual <strong>en</strong> todas las clases<br />
derivadas. La redefinición de una función virtual <strong>en</strong> una clase derivada se conoce<br />
como overriding.<br />
Hay que hacer notar que sólo es necesario declarar la función como virtual<br />
<strong>en</strong> la clase base. Todas las funciones de las clases derivadas que <strong>en</strong>caj<strong>en</strong> con la<br />
declaración que esté <strong>en</strong> la clase base serán llamadas usando el mecanismo virtual. Se<br />
puede usar la palabra reservada virtual <strong>en</strong> las declaraciones de las clases derivadas<br />
(no hace ningún mal), pero es redundante y puede causar confusión.<br />
Para conseguir el comportami<strong>en</strong>to deseado de Instrum<strong>en</strong>t2.cpp, simplem<strong>en</strong>te<br />
hay que añadir la palabra reservada virtual <strong>en</strong> la clase base antes de play().<br />
//: C15:Instrum<strong>en</strong>t3.cpp<br />
// Late binding with the virtual keyword<br />
#include <br />
using namespace std;<br />
<strong>en</strong>um note { middleC, Csharp, Cflat }; // Etc.<br />
class Instrum<strong>en</strong>t {<br />
public:<br />
virtual void play(note) const {<br />
cout