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