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