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

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

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

Saved successfully!

Ooh no, something went wrong!