Binding estático (early binding, tiempo de compilación):
void greet() { std::cout << "¡Hola!"; }
Binding dinámico (late binding, tiempo de ejecución):
class Animal { public: virtual void speak() { std::cout << "Animal"; } }; class Dog : public Animal { public: void speak() override { std::cout << "¡Guau!"; } }; void foo(Animal* a) { a->speak(); } // binding dinámico
Cuándo usar:
¿El uso de la palabra clave override acelerará el funcionamiento de las funciones virtuales?
Respuesta:
No, la palabra clave override solo sirve para indicar explícitamente al compilador que la función debe sobreescribir una función base virtual. No influye en el rendimiento ni en la forma de llamar a las funciones.
class A { public: virtual void func(); }; class B : public A { public: void func() override; // para comprobar con el compilador, pero no cambia la velocidad de llamada };
Historia
En una biblioteca de intercambio de alta carga, el equipo utilizó métodos virtuales para la mayoría de las operaciones, incluso cuando el polimorfismo no era necesario. Como resultado, el sistema funcionaba más lentamente de lo planeado: el principal cuello de botella estaba en las búsquedas de vtable.
Historia
En un proyecto con algoritmos extensibles, los empleados utilizaron métodos normales en lugar de virtuales. Más tarde se descubrió que, al pasar objetos a través de punteros base, el comportamiento no cambiaba, resultando en cálculos incorrectos; los errores se solucionaron reescribiendo la interfaz.
Historia
En un proyecto de análisis de archivos multimedia, los desarrolladores confundieron métodos estáticos y virtuales. Algunas funciones para diferentes formatos olvidaron declararse como virtuales y no se sobreescribieron en los herederos, lo que llevó a que el procesamiento de archivos se realizara por rutas incorrectas y los resultados se cachéaran con errores.