Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
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 />
✐