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 449 — #487<br />
✐<br />
15.7. Clases base abstractas y funciones virtuales puras<br />
Figura 15.3: Clase abstracta<br />
La única razón para establecer una interfaz común es que después se pueda expresar<br />
de forma difer<strong>en</strong>te <strong>en</strong> cada subtipo. Se crea una forma básica que ti<strong>en</strong>e lo que<br />
está <strong>en</strong> común con todas las clases derivadas y nada más. Por esto, Instrum<strong>en</strong>t es<br />
un candidato perfecto para ser una clase abstracta. Se crea una clase abstracta sólo<br />
cuando se quiere manipular un conjunto de clases a través de una interfaz común,<br />
pero la interfaz común no necesita t<strong>en</strong>er una implem<strong>en</strong>tación (o como mucho, no<br />
necesita una implem<strong>en</strong>tación completa).<br />
Si se ti<strong>en</strong>e un concepto como Instrum<strong>en</strong>t que funciona como clase abstracta,<br />
los objetos de esa clase casi nunca t<strong>en</strong>drán s<strong>en</strong>tido. Es decir, Instrum<strong>en</strong>t sirve solam<strong>en</strong>te<br />
para expresar la interfaz, y no una implem<strong>en</strong>tación particular, por lo que crear<br />
un objeto que sea únicam<strong>en</strong>te un Instrum<strong>en</strong>t no t<strong>en</strong>drá s<strong>en</strong>tido, y probablem<strong>en</strong>te<br />
se quiera prev<strong>en</strong>ir al usuario de hacerlo. Se puede solucionar haci<strong>en</strong>do que todas<br />
las funciones virtuales <strong>en</strong> Instrum<strong>en</strong>t muestr<strong>en</strong> m<strong>en</strong>sajes de error, pero retrasa la<br />
aparición de los errores al tiempo de ejecución lo que obligará a un testeo exhaustivo<br />
por parte del usuario. Es mucho más productivo cazar el problema <strong>en</strong> tiempo de<br />
compilación.<br />
Aquí está la sintaxis usada para una función virtual pura:<br />
virtual void f() = 0;<br />
Haci<strong>en</strong>do esto, se indica al compilador que reserve un hueco para una función <strong>en</strong><br />
la VTABLE, pero que no ponga una dirección <strong>en</strong> ese hueco. Incluso aunque sólo una<br />
449<br />
✐<br />
✐<br />
✐<br />
✐