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 14 — #52<br />

✐<br />

Capítulo 1. Introducción a los Objetos<br />

lógico y seguro.<br />

A este proceso de tratar un tipo derivado como si fuera su tipo base se le llama<br />

upcasting (moldeado hacia arriba 6 ). El nombre cast (molde) se usa <strong>en</strong> el s<strong>en</strong>tido de adaptar<br />

a un molde y es hacia arriba por la forma <strong>en</strong> que se dibujan los diagramas de clases<br />

para indicar la her<strong>en</strong>cia, con el tipo base <strong>en</strong> la parte superior y las clases derivadas<br />

colgando debajo. De esta manera, moldear un tipo base es moverse hacia arriba por<br />

el diagrama de her<strong>en</strong>cias: «upcasting»<br />

"Upcasting"<br />

Figura<br />

Círculo Cuadrado Triángulo<br />

Figura 1.9: Upcasting<br />

Todo programa ori<strong>en</strong>tado a objetos ti<strong>en</strong>e algún upcasting <strong>en</strong> alguna parte, porque<br />

así es como se despreocupa de t<strong>en</strong>er que conocer el tipo exacto con el que está<br />

trabajando. Mire el código de hacerTarea():<br />

f.borrar();<br />

// ...<br />

f.dibujar();<br />

Observe que no dice «Si es un Círculo, haz esto, si es un Cuadrado, haz esto<br />

otro, etc.». Si escribe un tipo de código que comprueba todos los posibles tipos que<br />

una Figura puede t<strong>en</strong>er realm<strong>en</strong>te, resultará sucio y t<strong>en</strong>drá que cambiarlo cada vez<br />

que añada un nuevo tipo de Figura. Aquí, sólo dice «Eres una figura, sé que te<br />

puedes borrar() y dibujar() a ti misma, hazlo, y preocúpate de los detalles».<br />

Lo impresionante del código <strong>en</strong> hacerTarea() es que, de alguna manera, funciona<br />

bi<strong>en</strong>. Llamar a dibujar() para un Círculo ejecuta difer<strong>en</strong>te código que<br />

cuando llama a dibujar() para un Cuadrado o una Línea, pero cuando se <strong>en</strong>vía<br />

el m<strong>en</strong>saje dibujar() a un Figura anónima, la conducta correcta sucede <strong>en</strong> base<br />

<strong>en</strong> el tipo real de Figura. Esto es asombroso porque, como se m<strong>en</strong>cionó anteriorm<strong>en</strong>te,<br />

cuando el compilador <strong>C++</strong> está compilando el código para hacerTarea(),<br />

no sabe exactam<strong>en</strong>te qué tipos está manipulando. Por eso normalm<strong>en</strong>te, es de esperar<br />

que acabe invocando la versión de borrar() y dibujar() para Figura, y no<br />

para el Círculo, Cuadrado, o Línea específico. Y aún así ocurre del modo correcto<br />

a causa del polimorfismo. El compilador y el sistema se <strong>en</strong>cargan de los detalles;<br />

todo lo que necesita saber es que esto ocurre y lo que es más importante, cómo utilizarlo<br />

<strong>en</strong> sus diseños. Si un método es virtual, <strong>en</strong>tonces cuando <strong>en</strong>víe el m<strong>en</strong>saje a<br />

6 N. de T: En el libro se utilizará el término original <strong>en</strong> inglés debido a su uso común, incluso <strong>en</strong> la<br />

literatura <strong>en</strong> castellano.<br />

14<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!