1. Métodos estáticos são o tipo de método padrão. Eles são chamados como procedimentos e funções normais. O compilador conhece os endereços desses métodos, portanto, quando um método estático é chamado, ele pode vincular estaticamente as informações em execução ao arquivo executável. , portanto, os métodos estáticos são os mais rápidos, mas não podem ser substituídos para oferecer suporte ao polimorfismo.
2. Métodos virtuais e métodos estáticos são chamados da mesma maneira. Como os métodos virtuais podem ser substituídos, o compilador não conhece o endereço de um método virtual especificado quando ele é chamado no código. Portanto, o compilador procura o endereço da função em tempo de execução construindo uma tabela de métodos virtuais (VMT). Todos os métodos virtuais são processados por meio do VMT em tempo de execução. Além dos métodos virtuais autodefinidos, a tabela VMT de um objeto também possui todos os seus métodos virtuais. Portanto, os métodos virtuais usam mais memória do que os métodos dinâmicos, mas são executados de forma relativamente rápida.
3. Os métodos dinâmicos são basicamente semelhantes aos métodos virtuais, exceto que seus sistemas de altura são diferentes. O compilador atribui um número exclusivo a cada método dinâmico e usa esse número e o endereço do método dinâmico para construir uma tabela de métodos dinâmicos (DMT). Ao contrário da tabela VMT, existem apenas métodos dinâmicos declarados na tabela DMT, e este método requer que a tabela DMT ancestral acesse outros métodos dinâmicos. Por causa disso, os métodos dinâmicos usam menos memória que os métodos virtuais, mas são mais lentos para executar porque podem ter que procurar métodos dinâmicos no DMT do objeto.
4. O OP usa substituição para fazer um método mostrar comportamentos diferentes em diferentes classes derivadas. Os métodos que podem ser substituídos no OP são métodos marcados como virtuais ou dinâmicos quando declarados. Para substituir um método, use override em vez de virtual ou dinâmico na declaração da classe derivada. Depois de usar a substituição, o compilador substituirá o método original no VMT por um novo método, e o método original ainda existirá. Se você usar a substituição para declarar um método estático novamente, será uma substituição real, que será completamente coberta pelo novo método. . Substitua o mesmo método na classe ancestral.