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

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

Saved successfully!

Ooh no, something went wrong!