A estas alturas usted se puede hacer una pregunta: "Si esta técnica es tan importante, y si se ejecuta la función correcta todo el tiempo, ¿por qué es una opción? ¿por qué es necesario conocerla?"
Es una buena pregunta, y la respuesta se debe a la filosofía
fudamental de C++: "Debido a que no es tan eficiente". Se puede
ver en el código en lenguaje ensamblador que se generan, en vez de
un simple CALL
a una dirección absoluta, dos
instrucciones ensamblador necesarias para preparar la llamada a
función. Esto requiere más código y tiempo de ejecución.
Algunos lenguajes orientado a objetos han decidido que la
aproximación a la ligadura dinámica es intrínseca a la
programación orientada a objetos, que siempre debe tener lugar,
que no puede ser opcional, y que el usuario no tiene por qué
conocerlo. Esta es una decisión de diseño cuando se crea un
lenguaje, y éste camino particular es adecuado para varios
lenguajes[77].
Sin embargo, C++ tiene una tara por venir
de C, donde la eficiencia es crítica. Después de todo, C fué
creado para sustituir al lenguaje ensamblador para la
implementación de un sistema operativo (haciendo a este sistema
operativo - Unix - mucho más portable que sus antecesores). Y una
de las principales razones para la invención de C++ fue hacer más
eficientes a los programadores de C[78]. Y la primera pregunta cuando un programador de C se
pasa a C++ es, "¿Cómo me afectará el cambio en velocidad y tamaño?
Si la respuesta fuera, "Todo es magnífico excepto en las llamadas
a funciones donde siempre tendrá un pequeña sobrecarga extra",
mucha gente se hubiera aguantado con C antes que hacer el cambio a
C++. Además las funciones inline no serían posibles, porque las
funciones virtuales deben tener una dirección para meter en la
VTABLE. Por lo tanto las funciones virtuales son opcionales,
y por defecto el lenguaje no es
virtual
, porque es la configuración más
eficiente. Stroustrup expuso que su línea de trabajo era, "Si no
lo usa, no lo pague".
Además la palabra reservada virtual
permite
afinar el rendimiento. Cuando se diseñan las clases, sin embargo,
no hay que preocuparse por afinarlas. Si va a usar el
polimorfismo, úselo en todos los sitios. Sólo es necesario buscar
funciones que se puedan hacer no virtuales cuando se esté buscando
modos de acelerar el código (y normalmente hay mucho más que ganar
en otras áreas - una buena idea es intentar adivinar dónde se
encuentran los cuellos de botella).
Como anécdota la evidencia sugiere que el tamaño y la velocidad de C++ sufren un impacto del 10 por ciento con respecto a C, y a menudo están mucho más cerca de ser parejos. Además otra razón es que se puede diseñar un programa en C++ más rápido y más pequeño que como sería en C.