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 474 — #512<br />

✐<br />

Capítulo 15. Polimorfismo y Funciones virtuales<br />

s<strong>en</strong>t<strong>en</strong>cias const y switch), pero sin embargo funciona únicam<strong>en</strong>te de forma conjunta,<br />

como una parte de un "gran cuadro" de relaciones <strong>en</strong>tre clases. La g<strong>en</strong>te se<br />

vuelve a m<strong>en</strong>udo confusa con otras características no ori<strong>en</strong>tadas a objetos de <strong>C++</strong><br />

como es la sobrecarga y los argum<strong>en</strong>tos por defecto, los cuales son pres<strong>en</strong>tados a<br />

veces como ori<strong>en</strong>tado a objetos. No nos liemos; si no hay ligadura dinámica, no hay<br />

polimorfismo.<br />

Para usar el polimorfismo - y por lo tanto, técnicas ori<strong>en</strong>tadas a objetos - <strong>en</strong> los<br />

programas hay que ampliar la visión de la programación para incluir no solo miembros<br />

y m<strong>en</strong>sajes <strong>en</strong>tre clases individuales, si no también sus puntos <strong>en</strong> común y las<br />

relaciones <strong>en</strong>tre ellas. Aunque requiere un esfuerzo significativo, es recomp<strong>en</strong>sado<br />

gracias a que se consigue mayor velocidad <strong>en</strong> el desarrollo, mejor organización de<br />

código, programas ext<strong>en</strong>sibles, y mayor mant<strong>en</strong>ibilidad.<br />

El polimorfismo completa las características de ori<strong>en</strong>tación a objetos del l<strong>en</strong>guaje,<br />

pero hay dos características fundam<strong>en</strong>tales más <strong>en</strong> <strong>C++</strong>: plantillas (introducidas <strong>en</strong><br />

el capítulo 16 y cubiertas <strong>en</strong> mayor detalle <strong>en</strong> el segundo volum<strong>en</strong> de este libro), y<br />

manejo de excepciones (cubierto <strong>en</strong> el Volum<strong>en</strong> 2). Estas características nos proporcionan<br />

un increm<strong>en</strong>to de poder de cada una de las características de la ori<strong>en</strong>tación a<br />

objetos: tipado abstracto de datos, her<strong>en</strong>cia, y polimorfismo.<br />

15.14. Ejercicios<br />

Las soluciones a los ejercicios se pued<strong>en</strong> <strong>en</strong>contrar <strong>en</strong> el docum<strong>en</strong>to electrónico<br />

titulado «The Thinking in <strong>C++</strong> Annotated Solution Guide», disponible por poco<br />

dinero <strong>en</strong> www.BruceEckel.com.<br />

1. Cree una jerarquía simple "figura": una clase base llamada Figura y una clases<br />

derivadas llamadas Circulo, Cuadrado, y Triangulo. En la clase base, hay<br />

que hacer una función virtual llamada dibujar(), y sobreescribirla <strong>en</strong> las<br />

clases derivadas. Hacer un array de punteros a objetos Figura que se cre<strong>en</strong> <strong>en</strong><br />

el montón (heap) y que obligue a realizar upcasting de los punteros, y llamar<br />

a dibujar() a través de la clase base para verificar el comportami<strong>en</strong>to de las<br />

funciones virtuales. Si el depurador lo soporta, int<strong>en</strong>te ver el programa paso a<br />

paso.<br />

2. Modifique el Ejercicio 1 de tal forma que dibujar() sea una función virtual<br />

pura. Int<strong>en</strong>te crear un objeto de tipo Figura. Int<strong>en</strong>te llamar a la función virtual<br />

pura d<strong>en</strong>tro del constructor y mire lo que ocurre. Dejándolo como una función<br />

virtual pura cree una definición para dibujar().<br />

3. Aum<strong>en</strong>tando el Ejercicio 2, cree una función que use un objeto Figura por<br />

valor e int<strong>en</strong>te hacer un upcast de un objeto derivado como argum<strong>en</strong>to. Vea lo<br />

que ocurre. Arregle la función usando una refer<strong>en</strong>cia a un objeto Figura.<br />

4. Modifique C14:Combined.cpp para que f() sea virtual <strong>en</strong> la clase base.<br />

Cambie el main() para que se haga un upcast y una llamada virtual.<br />

5. Modifique Instrum<strong>en</strong>t3.cpp añadi<strong>en</strong>do una función virtual preparar().<br />

Llame a preparar() d<strong>en</strong>tro de tune().<br />

6. Cree una jerarquía de her<strong>en</strong>cia de Roedores: Raton, Gerbo, Hamster, etc. En<br />

la clase base, proporcione los métodos que son comunes a todos los roedores, y<br />

redefina aquellos <strong>en</strong> las clases derivadas para que t<strong>en</strong>gan difer<strong>en</strong>tes comportami<strong>en</strong>tos<br />

dep<strong>en</strong>di<strong>en</strong>do del tipo específico de roedor. Cree un array de punteros<br />

474<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!