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 430 — #468<br />

✐<br />

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

El fichero es idéntico a InheritStack.cpp, excepto que un objeto Stack es alojado <strong>en</strong><br />

StringStack y se utilizan las funciones miembros para llamarlo. No se consume tiempo<br />

o espacio porque el subobjeto ti<strong>en</strong>e el mismo tamaño y todas las comprobaciones<br />

de tipos han ocurrido <strong>en</strong> tiempo de compilación.<br />

Sin embargo, esto ti<strong>en</strong>de a confusión, podría también utilizar la her<strong>en</strong>cia privada<br />

para expresar "implem<strong>en</strong>tado <strong>en</strong> términos de". Esto también resolvería el problema<br />

de forma adecuada. Un punto importante es cuando la her<strong>en</strong>cia múltiple puede ser<br />

garantizada. En este caso, si observa un diseño <strong>en</strong> que la composición pueda utilizarse<br />

<strong>en</strong> vez de la her<strong>en</strong>cia, debe eliminar la necesidad de utilizar her<strong>en</strong>cia múltiple.<br />

14.10.4. FIXME Upcasting de punteros y refer<strong>en</strong>cias<br />

En Instrum<strong>en</strong>t.cpp, la conversión ocurre durante la llamada a la función - un objeto<br />

Wind fuera de la función se toma como refer<strong>en</strong>cia y se convierte <strong>en</strong> una refer<strong>en</strong>cia<br />

Instrum<strong>en</strong>t d<strong>en</strong>tro de la función. La conversión puede también ocurrir durante una<br />

asignación a un puntero o una refer<strong>en</strong>cia.<br />

Wind w;<br />

Instrum<strong>en</strong>t* ip = &w; // Upcast<br />

Instrum<strong>en</strong>t& ir = w; // Upcast<br />

Como <strong>en</strong> la llamada a la función, ninguno de estos casos requiere una conversión<br />

explicita.<br />

14.10.5. Una crisis<br />

Por supuesto, cualquier conversión pierde la información del tipo sobre el objeto.<br />

Si dice<br />

Wind w;<br />

Instrum<strong>en</strong>t* ip = &w;<br />

el compilador puede utilizar ip solo como un puntero a Instrum<strong>en</strong>to y nada mas.<br />

Esto es, éste no puede conocer que ip realm<strong>en</strong>te esta apuntando a un objeto Wind.<br />

Entonces cuando llame a la función miembro play() dici<strong>en</strong>do<br />

ip->play(middleC);<br />

el compilador solo puede conocer que la llamada a play() es de un puntero a<br />

Instrum<strong>en</strong>t y llamara a la versión de la clase base Instrum<strong>en</strong>t::play() <strong>en</strong> vez de lo<br />

que debería hacer, que es llamar a Wind::play(). Así, no conseguirá una conducta<br />

adecuada.<br />

esto es un problema importante; es resulto <strong>en</strong> el Capitulo 15, introducción al tercer<br />

pilar de la programación ori<strong>en</strong>tada a objetos: poliformismo (implem<strong>en</strong>tado <strong>en</strong><br />

<strong>C++</strong> con funciones virtuales).<br />

430<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!