Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
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 441 — #479<br />
✐<br />
15.5. Cómo implem<strong>en</strong>ta <strong>C++</strong> la ligadura dinámica<br />
tune(flute);<br />
tune(drum);<br />
tune(violin);<br />
tune(flugelhorn);<br />
tune(recorder);<br />
f(flugelhorn);<br />
} ///:~<br />
Se puede ver que se ha añadido otro nivel de her<strong>en</strong>cia debajo de Wind, pero el<br />
mecanismo virtual funciona correctam<strong>en</strong>te sin importar cuantos niveles haya. La<br />
función adjust() no está redefinida (override) por Brass y Woodwind. Cuando esto<br />
ocurre, se usa la definición más "cercana" <strong>en</strong> la jerarquía de her<strong>en</strong>cia - el compilador<br />
garantiza que exista alguna definición para una función virtual, por lo que nunca<br />
acabará <strong>en</strong> una llamada que no esté <strong>en</strong>lazada con el cuerpo de una función (lo cual<br />
sería desatroso).<br />
El array A[] conti<strong>en</strong>e punteros a la clase base Instrum<strong>en</strong>t, lo que implica que<br />
durante el proceso de inicialización del array habrá upcasting. Este array y la función<br />
f() serán usados <strong>en</strong> posteriores discusiones.<br />
En la llamada a tune(), el upcasting se realiza <strong>en</strong> cada tipo de objeto, haci<strong>en</strong>do<br />
que se obt<strong>en</strong>ga siempre el comportami<strong>en</strong>to deseado. Se puede describir como "<strong>en</strong>viar<br />
un m<strong>en</strong>saje a un objeto y dejar al objeto que se preocupe sobre qué hacer con él".<br />
La función virtual es la l<strong>en</strong>te a usar cuando se está analizando un proyecto: ¿Dónde<br />
deb<strong>en</strong> estar las clases base y cómo se desea ext<strong>en</strong>der el programa Sin embargo,<br />
incluso si no se descubre la interfaz apropiada para la clase base y las funciones virtuales<br />
durante la creación del programa, a m<strong>en</strong>udo se descubrirán más tarde, incluso<br />
mucho más tarde cuando se desee ampliar o se vaya a hacer funciones de mant<strong>en</strong>imi<strong>en</strong>to<br />
<strong>en</strong> el programa. Esto no implica un error de análisis o de diseño; simplem<strong>en</strong>te<br />
significa que no se conocía o no se podía conocer toda la información al principio.<br />
Debido a la fuerte modularización de <strong>C++</strong>, no es mucho problema que esto suceda<br />
porque los cambios que se hagan <strong>en</strong> una parte del sistema no ti<strong>en</strong>d<strong>en</strong> a propagarse<br />
a otras partes como sucede <strong>en</strong> C.<br />
15.5. Cómo implem<strong>en</strong>ta <strong>C++</strong> la ligadura dinámica<br />
¿Cómo funciona la ligadura dinámica Todo el trabajo se realiza detrás del telón<br />
gracias al compilador, que instala los mecanismos necesarios de la ligadura dinámica<br />
cuando se crean funciones virtuales. Debido a que los programadores se suel<strong>en</strong><br />
b<strong>en</strong>eficiar de la compr<strong>en</strong>sión del mecanismo de las funciones virtuales <strong>en</strong> <strong>C++</strong>, esta<br />
sección mostrará la forma <strong>en</strong> que el compilador implem<strong>en</strong>ta este mecanismo.<br />
La palabra reservada virtual le dice al compilador que no debe realizar ligadura<br />
estática. Al contrario, debe instalar automáticam<strong>en</strong>te todos los mecanismos necesarios<br />
para realizar la ligadura dinámica. Esto significa que si se llama a play()<br />
para un objeto Brass a través una dirección a la clase base Instrum<strong>en</strong>t, se usará la<br />
función apropiada.<br />
Para que funcione, el compilador típico 2 crea una única tabla (llamada VTABLE)<br />
por cada clase que cont<strong>en</strong>ga funciones virtuales. El compilador coloca las direcciones<br />
de las funciones virtuales de esa clase <strong>en</strong> concreto <strong>en</strong> la VTABLE. En cada<br />
2 Los compiladores pued<strong>en</strong> implem<strong>en</strong>tar el comportami<strong>en</strong>to virtual como quieran, pero el modo aquí<br />
descrito es una aproximación casi universal.<br />
441<br />
✐<br />
✐<br />
✐<br />
✐