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 448 — #486<br />
✐<br />
Capítulo 15. Polimorfismo y Funciones virtuales<br />
era, "Si no lo usa, no lo pague".<br />
Además la palabra reservada virtual permite afinar el r<strong>en</strong>dimi<strong>en</strong>to. Cuando se<br />
diseñan las clases, sin embargo, no hay que preocuparse por afinarlas. Si va a usar<br />
el polimorfismo, úselo <strong>en</strong> todos los sitios. Sólo es necesario buscar funciones que se<br />
puedan hacer no virtuales cuando se esté buscando modos de acelerar el código (y<br />
normalm<strong>en</strong>te hay mucho más que ganar <strong>en</strong> otras áreas - una bu<strong>en</strong>a idea es int<strong>en</strong>tar<br />
adivinar dónde se <strong>en</strong>cu<strong>en</strong>tran los cuellos de botella).<br />
Como anécdota la evid<strong>en</strong>cia sugiere que el tamaño y la velocidad de <strong>C++</strong> sufr<strong>en</strong><br />
un impacto del 10 por ci<strong>en</strong>to con respecto a C, y a m<strong>en</strong>udo están mucho más cerca<br />
de ser parejos. Además otra razón es que se puede diseñar un programa <strong>en</strong> <strong>C++</strong> más<br />
rápido y más pequeño que como sería <strong>en</strong> C.<br />
15.7. Clases base abstractas y funciones virtuales<br />
puras<br />
A m<strong>en</strong>udo <strong>en</strong> el diseño, se quiere la clase base para pres<strong>en</strong>tar sólo una interfaz<br />
para sus clases derivadas. Esto es, se puede querer que nadie pueda crear un objeto<br />
de la clase base y que ésta sirva únicam<strong>en</strong>te para hacer un upcast hacia ella, y poder<br />
t<strong>en</strong>er una interfaz. Se consigue haci<strong>en</strong>do a la clase abstract (abstracta), poni<strong>en</strong>do como<br />
mínimo una función virtual pura. Se puede reconocer a una función virtual pura<br />
porque usa la palabra reservada virtual y es seguida por =0. Si algui<strong>en</strong> int<strong>en</strong>ta<br />
hacer un objeto de una clase abstracta, el compilador lo impide. Esta es una utilidad<br />
que fuerza a un diseño <strong>en</strong> concreto.<br />
Cuando se hereda una clase abstracta, hay que implem<strong>en</strong>tar todas las funciones<br />
virtuales, o la clase que hereda se convierte <strong>en</strong> una nueva clase abstracta. Crear una<br />
función virtual pura permite poner una fución miembro <strong>en</strong> una interfaz sin forzar a<br />
proveer un cuerpo con código sin significado para esa función miembro. Al mismo<br />
tiempo, una función virtual fuerza a las clases que la hered<strong>en</strong> a que implem<strong>en</strong>te una<br />
definición para ellas.<br />
En todos los ejemplos de los intrum<strong>en</strong>tos, las funciones <strong>en</strong> la clase base Instrum<strong>en</strong>t<br />
eran siempre funciones «tontas». Si esas funciones hubieran sido llamadas algo<br />
iba mal. Esto es porque la int<strong>en</strong>ción de la clase Instrum<strong>en</strong>t es crear una interfaz<br />
común para todas las clases que deriv<strong>en</strong> de ella.<br />
448<br />
✐<br />
✐<br />
✐<br />
✐