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 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 />
✐