13.01.2015 Views

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!