En resumen: Desde un puntero de clase base C++ que apunta a una instancia de una clase derivada, ¿cómo se puede determinar en tiempo de ejecución si la función virtual no pura (con una implementación en la clase base) se ha vuelto a implementar en la clase derivada?Formas de detectar si una función virtual C++ ha sido redefinida en una clase derivada
Contexto: Estoy escribiendo una biblioteca en C++ para resolver ciertas clases de ecuaciones matemáticas. La biblioteca proporciona una clase Equation
con varias funciones virtuales, que los usuarios de la biblioteca utilizan como una clase base para la ecuación particular que desean resolver. La biblioteca también proporciona una clase Solver
, que toma un Equation *
como un parámetro de constructor. Entonces, el usuario escribe el código a lo largo de las líneas de:
class MyEquation : public Equation
{ ... } // equation definition here
int main()
{
MyEquation myEqn;
Solver solver(&myEqn);
solver.Solve();
}
Si ciertas combinaciones de las funciones virtuales en Equation
no se redefine en la clase ecuación derivada, ciertas partes computacionalmente caras del algoritmo de ejecutar por el objeto Solver
pueden omitirse . Por lo tanto, me gustaría saber, en el constructor de Solver
, qué funciones se han redefinido, y cuáles ejecutarán la implementación predeterminada en Equation
.
me gustaría hacer este transparente para los usuarios de la biblioteca, así que no estoy buscando una solución que, por ejemplo, el usuario establece algunas banderas en el constructor de su especificando ecuación derivada qué funciones se han redefinido .
Una posible solución es para las implementaciones predeterminadas de las funciones virtuales en
Equation
para establecer un indicador privado en la claseEquation
; El constructor de la claseSolver
puede borrar este indicador, ejecutar la función virtual y verificar el valor del indicador para ver si se ha llamado a la implementación enEquation
. Me gustaría evitar esto, porque simplemente establecer el indicador cada vez que se ejecuta la función virtual ralentiza mucho el algoritmo (la ejecución de estas funciones virtuales contribuye significativamente al tiempo de ejecución del programa, y las implementaciones predeterminadas simplemente regresan una constante).
¿Estás seguro de que establecer una marca hace alguna diferencia? Me imagino que es completamente insignificante en comparación con la sobrecarga de invocar una llamada de función virtual. –
Eso parece ser altamente dependiente de la arquitectura. Para este programa, en el servidor Xeon de 64 bits que es la máquina de destino, la sobrecarga para llamadas a funciones virtuales parece ser prácticamente nula. En la computadora de mi casa (Athlon de 32 bits), sin embargo, como sospechabas, la sobrecarga de llamada a la función fue mucho mayor que el tiempo para configurar una bandera. –
¿No tiene la necesidad de determinar si una virtual tiene una anulación que le parece totalmente ortogonal al polimorfismo en primer lugar? Ciertamente me hace. En otras palabras, si necesita hacer esto, su diseño está roto. –