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 426 — #464<br />

✐<br />

Capítulo 14. Her<strong>en</strong>cia y Composición<br />

};<br />

// Wind objects are Instrum<strong>en</strong>ts<br />

// because they have the same interface:<br />

class Wind : public Instrum<strong>en</strong>t {};<br />

void tune(Instrum<strong>en</strong>t& i) {<br />

// ...<br />

i.play(middleC);<br />

}<br />

int main() {<br />

Wind flute;<br />

tune(flute); // Upcasting<br />

} ///:~<br />

Lo interesante <strong>en</strong> este ejemplo es la función tune(), que acepta una refer<strong>en</strong>cia Instrum<strong>en</strong>t.<br />

Sin embargo, <strong>en</strong> main() la función tune() se llama utilizando una refer<strong>en</strong>cia<br />

a un objeto Wind. Dado que <strong>C++</strong> es un muy peculiar sobre la comprobación de tipos,<br />

parece extraño que una función que acepta solo un tipo pueda aceptar otro tipo, al<br />

m<strong>en</strong>os que sepa que un objeto Instrum<strong>en</strong>t es tambi<strong>en</strong> un objeto Instrum<strong>en</strong>t.<br />

14.10.1. ¿Por qué «upcasting»<br />

La razón de este término es histórica y esta basada <strong>en</strong> la manera <strong>en</strong> que se dibuja<br />

la her<strong>en</strong>cia: con la raíz <strong>en</strong> la parte superior de la pagina y hacia abajo (por supuesto<br />

que puede pintar su diagrama de cualquier modo que le sea útil). El diagrama para<br />

Instrum<strong>en</strong>t.cpp es:<br />

Instrum<strong>en</strong>to<br />

Vi<strong>en</strong>to<br />

Figura 14.1: Upcasting<br />

El hecho de pasar de la clase derivada a la clase base, esto es, desplazarse hacia<br />

arriba <strong>en</strong> el diagrama de la her<strong>en</strong>cia, es normalm<strong>en</strong>te conocido como upcasting. Upcasting<br />

es siempre seguro porque se esta desplazando de un tipo desde un tipo mas<br />

especifico a otro tipo mas g<strong>en</strong>eral. - únicam<strong>en</strong>te puede ocurrir es que la interfaz de<br />

la clase pierda algunas funciones miembro, pero no ganarlas. Esto es porque el compilador<br />

permite el upcasting sin ninguna conversión explicita o notación especial.<br />

14.10.2. FIXME Upcasting y el constructor de copia<br />

Si permite que el compilador cree un constructor copia de una clase derivada,<br />

éste llamara automáticam<strong>en</strong>te al constructor copia de la clase base, y <strong>en</strong>tones ,a los<br />

426<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!