1. Los métodos estáticos son el tipo de método predeterminado. Se llaman como procedimientos y funciones normales. El compilador conoce las direcciones de estos métodos, por lo que cuando se llama a un método estático, puede vincular estáticamente la información en ejecución al archivo ejecutable. , por lo que los métodos estáticos son los más rápidos, pero no se pueden anular para admitir el polimorfismo.
2. Los métodos virtuales y los métodos estáticos se llaman de la misma manera. Debido a que los métodos virtuales se pueden anular, el compilador no conoce la dirección de un método virtual específico cuando se llama en el código. Por lo tanto, el compilador busca la dirección de la función en tiempo de ejecución mediante la creación de una tabla de métodos virtuales (VMT). Todos los métodos virtuales se procesan a través de VMT en tiempo de ejecución. Además de los métodos virtuales autodefinidos, la tabla VMT de un objeto también tiene todos sus métodos virtuales. Por lo tanto, los métodos virtuales usan más memoria que los métodos dinámicos, pero se ejecutan relativamente rápido.
3. Los métodos dinámicos son básicamente similares a los métodos virtuales, excepto que sus sistemas de altura son diferentes. El compilador asigna un número único a cada método dinámico y utiliza este número y la dirección del método dinámico para construir una tabla de métodos dinámicos (DMT). A diferencia de la tabla VMT, solo hay métodos dinámicos declarados en la tabla DMT y este método requiere que la tabla DMT ancestral acceda a otros métodos dinámicos. Debido a esto, los métodos dinámicos usan menos memoria que los métodos virtuales, pero su ejecución es más lenta porque es posible que tengan que buscar métodos dinámicos en el DMT del objeto.
4. El OP utiliza la anulación para hacer que un método muestre diferentes comportamientos en diferentes clases derivadas. Los métodos que se pueden anular en el OP son métodos que se marcan como virtuales o dinámicos cuando se declaran. Para anular un método, utilice override en lugar de virtual o dinámico en la declaración de clase derivada. Después de usar override, el compilador reemplazará el método original en VMT con un nuevo método, y el método original aún existe. Si usa override para declarar un método estático nuevamente, es una anulación real, que está completamente cubierta por el nuevo método. Reemplace el mismo método en la clase ancestral.