Tabla de contenidos
El polimorfismo (implementado en C++ con funciones virtuales) es la tercera característica esencial de un lenguaje orientado a objetos, después de la abstracción de datos y la herencia.
Proporciona otra dimensión de separación entre la interfaz y la implementación, desacoplando el qué del cómo. El polimorfismo permite mejorar la organización del código y su legibilidad así como la creación de programas extensibles que pueden «crecer» no sólo durante la creación inicial del proyecto, sino también cuando se deseen nuevas características.
La encapsulación crea nuevos tipos de datos combinando características y comportamientos. El control de acceso separa la interfaz de la implementación haciendo privados (private) los detalles. Este tipo de organización mecánica resulta fácil de entender para cualquiera que venga de la programación procedimental. Pero las funciones virtuales se ocupan del desacoplamiento en términos de tipos. En el Capítulo 14, usted vio cómo la herencia permitía tratar a un objeto como su propio tipo o como su tipo base. Esta capacidad es crucial porque permite que muchos tipos (derivados del mismo tipo base) sean tratados como si fueran un único tipo, y que un único fragmento de código funcione indistintamente con todos ellos. Las funciones virtuales permiten a un tipo expresar sus diferencias con respecto a otro similar, siempre que ambos deriven del mismo tipo base. Esta distinción se expresa mediante diferencias en el comportamiento de las funciones a las que se puede llamar a través de la clase base.
En este capítulo aprenderá sobre las funciones virtuales, empezando por lo básico con ejemplos sencillos en los que se ha eliminado todo salvo lo «virtual» del programa.
Los programadores de C parecen conseguir pasarse a C++ en tres pasos. Primero, simplemente como un «C mejorado», debido a que C++ le obliga a declarar todas las funciones antes de usarlas y a que es mucho más exigente con la forma de usar las variables. A menudo se pueden encontrar errores en un programa C simplemente recompilándolo con un compilador de C++.
El segundo paso es el C++ «basado en objetos», lo que significa que se pueden ver fácilmente los beneficios de la organización del código al agrupar estructuras de datos junto con las funciones que las manejan, la potencia de los constructores y los destructores, y quizás algo de herencia simple. La mayoría de los programadores que han trabajado durante un tiempo con C ven rápidamente la utilidad de esto porque es exactamente lo que intentan hacer cada vez que crean una librería. Con C++ usted recibe la ayuda del compilador.
Usted se puede quedar atascado en el nivel «basado en objetos» porque se llega a él rápidamente y se obtienen muchos beneficios sin demasiado esfuerzo mental. También es fácil tener la sensación de que está creando tipos de datos - usted hace clases y objetos, envía mensajes a esos objetos, y todo es bonito y pulcro.
Pero no se deje engañar. Si se para aquí, se está perdiendo la mejor parte del lenguaje, que es el salto a la verdadera programación orientada a objetos. Y esto se consigue únicamente con las funciones virtuales.
Las funciones virtuales realzan el concepto de tipo en lugar de simplemente encapsular código dentro de estructuras y dejarlo detrás de un muro, por lo que son, sin lugar a dudas, el concepto más difícil de desentrañar para los nuevos programadores de C++. Sin embargo, son también el punto decisivo para comprender la programación orientada a objetos. Si no usa funciones virtuales, todavía no entiende la POO.
Debido a que las funciones virtuales están íntimamente unidas al concepto de tipo, y los tipos son el núcleo de la programación orientada a objetos, no existe nada análogo a las funciones virtuales en los lenguajes procedurales tradicionales. Como programador procedural, usted no tiene ningún referente con el que pensar en las funciones virtuales, como sí lo tiene con casi todas las demás características del lenguaje. Las características de un lenguaje procedural pueden entenderse en un nivel algorítmico, pero las funciones virtuales sólo pueden entenderse desde el punto de vista del diseño.