Tener al menos un método virtual en una clase C ++ (o cualquiera de sus clases principales) significa que la clase tendrá una tabla virtual y cada instancia tendrá un puntero virtual.
Entonces, el costo de la memoria es bastante claro. El más importante es el costo de la memoria en las instancias (especialmente si las instancias son pequeñas, por ejemplo, si solo están destinadas a contener un número entero: en este caso, tener un puntero virtual en cada instancia podría duplicar el tamaño de las instancias. el espacio de memoria utilizado por las tablas virtuales, supongo que suele ser insignificante en comparación con el espacio utilizado por el código de método real.
Esto me lleva a mi pregunta: ¿hay un costo de rendimiento medible (es decir, impacto en la velocidad) para hacer que un método sea virtual? Habrá una búsqueda en la tabla virtual en tiempo de ejecución, en cada llamada de método, por lo que si hay llamadas muy frecuentes a este método, y si este método es muy corto, ¿entonces podría haber un impacto de rendimiento medible? Supongo que depende de la plataforma, pero ¿alguien ha ejecutado algunos puntos de referencia?
La razón por la que pregunto es que encontré un error que se debió a que un programador se olvidó de definir un método virtual. Esta no es la primera vez que veo este tipo de error. Y pensé: ¿por qué añadir la palabra clave virtual cuando sea necesario en lugar de la eliminación de la palabra clave virtual cuando estamos absolutamente seguros de que está no necesita? Si el costo de rendimiento es bajo, creo que simplemente recomendaré lo siguiente en mi equipo: simplemente haga que todos los métodos sean virtuales de forma predeterminada, incluido el destructor, en cada clase, y solo elimínelos cuando sea necesario. ¿Eso te suena loco?