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

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

Saved successfully!

Ooh no, something went wrong!