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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 13 — #51<br />

✐<br />

1.6. Objetos intercambiables gracias al polimorfismo<br />

cuerpo de la función, usando información almac<strong>en</strong>ada <strong>en</strong> el objeto (este proceso se<br />

trata con detalle <strong>en</strong> el Capítulo 15). De este modo, cualquier objeto se puede comportar<br />

de forma difer<strong>en</strong>te de acuerdo con el cont<strong>en</strong>ido de este trozo especial de código.<br />

Cuando <strong>en</strong>vía un m<strong>en</strong>saje a un objeto, el objeto compr<strong>en</strong>de realm<strong>en</strong>te qué hacer con<br />

el m<strong>en</strong>saje.<br />

Es posible disponer de una función que t<strong>en</strong>ga la flexibilidad de las propiedades<br />

de la ligadura tardía usando la palabra reservada virtual. No necesita <strong>en</strong>t<strong>en</strong>der<br />

el mecanismo de virtual para usarla, pero sin ella no puede hacer programación<br />

ori<strong>en</strong>tada a objetos <strong>en</strong> <strong>C++</strong>. En <strong>C++</strong>, debe recordar añadir la palabra reservada virtual<br />

porque, por defecto, los métodos no se <strong>en</strong>lazan dinámicam<strong>en</strong>te. Los métodos<br />

virtuales le permit<strong>en</strong> expresar las difer<strong>en</strong>cias de comportami<strong>en</strong>to <strong>en</strong> clases de la misma<br />

familia. Estas difer<strong>en</strong>cias son las que causan comportami<strong>en</strong>tos polimórficos.<br />

Considere el ejemplo de la figura. El diagrama de la familia de clases (todas basadas<br />

<strong>en</strong> la misma interfaz uniforme) apareció antes <strong>en</strong> este capítulo. Para demostrar<br />

el polimorfismo, queremos escribir una única pieza de código que ignore los detalles<br />

específicos de tipo y hable sólo con la clase base. Este código está desacoplado de la<br />

información del tipo específico, y de esa manera es más simple de escribir y más fácil<br />

de <strong>en</strong>t<strong>en</strong>der. Y, si ti<strong>en</strong>e un nuevo tipo - un Hexágono, por ejemplo - se añade a través<br />

de la her<strong>en</strong>cia, el código que escriba funcionará igual de bi<strong>en</strong> para el nuevo tipo de<br />

Figura como para los tipos anteriores. De esta manera, el programa es ext<strong>en</strong>sible.<br />

Si escribe una función <strong>C++</strong> (podrá apr<strong>en</strong>der d<strong>en</strong>tro de poco cómo hacerlo):<br />

void hacerTarea(Figura& f) {<br />

f.borrar();<br />

// ...<br />

f.dibujar();<br />

}<br />

Esta función se puede aplicar a cualquier Figura, de modo que es indep<strong>en</strong>di<strong>en</strong>te<br />

del tipo específico del objeto que se dibuja y borra (el «&» significa «toma la dirección<br />

del objeto que se pasa a hacerTarea()», pero no es importante que <strong>en</strong>ti<strong>en</strong>da los<br />

detalles ahora). Si <strong>en</strong> alguna otra parte del programa usamos la función hacerTarea():<br />

Circulo c;<br />

Triangulo t;<br />

Linea l;<br />

hacerTarea(c);<br />

hacerTarea(t);<br />

hacerTarea(l);<br />

Las llamadas a hacerTarea() funcionan bi<strong>en</strong> automáticam<strong>en</strong>te, a pesar del tipo<br />

concreto del objeto.<br />

En efecto es un truco bonito y asombroso. Considere la línea:<br />

hacerTarea(c);<br />

Lo que está ocurri<strong>en</strong>do aquí es que está pasando un Círculo a una función que<br />

espera una Figura. Como un Círculo es una Figura se puede tratar como tal por<br />

parte de hacerTarea(). Es decir, cualquier m<strong>en</strong>saje que pueda <strong>en</strong>viar hacerTarea()<br />

a una Figura, un Círculo puede aceptarlo. Por eso, es algo completam<strong>en</strong>te<br />

13<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!