Virtual vs Abstrato
Virtual e Abstract são duas palavras-chave usadas na maioria das linguagens de programação orientadas a objetos (OO), como Java e C. Embora existam pequenas diferenças no que significa em diferentes linguagens, as palavras-chave Virtual e Abstract fornecem uma sensação de implementação parcial para as entidades às quais ela se conecta.
Resumo
Normalmente, classes abstratas, também conhecidas como classes básicas abstratas (ABC), não podem ser instanciadas (uma instância dessa classe não pode ser criada). Portanto, classes abstratas só são significativas se a linguagem de programação suportar herança (capacidade de criar subclasses a partir da extensão de uma classe). Classes abstratas geralmente representam um conceito abstrato ou entidade com implementação parcial ou nenhuma. Portanto, as classes abstratas atuam como classes pai das quais as classes filhas são derivadas, de modo que a classe filha compartilhará os recursos incompletos da classe pai e a funcionalidade pode ser adicionada para completá-los. Classes abstratas podem conter métodos abstratos. As subclasses que estendem uma classe abstrata podem implementar esses métodos abstratos (herdados). Se a classe filha implementa todos esses métodos abstratos, ela é uma classe concreta. Mas se isso não acontecer, a classe filha também se torna uma classe abstrata. O que tudo isso significa é que, quando o programador nomeia uma classe como Abstract, ela está dizendo que a classe estará incompleta e terá elementos que precisam ser completados pelas subclasses herdadas. Esta é uma boa maneira de criar um contrato entre dois programadores, o que simplifica as tarefas no desenvolvimento de software. O programador, que escreve código para herdar, precisa seguir exatamente as definições do método (mas é claro que pode ter sua própria implementação). Em Java e C, classes e métodos abstratos são declarados usando a palavra-chave Abstract.
Virtual
Os métodos/funções virtuais fornecem a capacidade de substituir opcionalmente seu comportamento por uma classe herdada (usando uma função com a mesma assinatura). O conceito de função Virtual é importante no cenário a seguir. Suponha que uma classe seja derivada por uma classe filha, então sempre que um objeto da classe derivada for usado, ele poderá se referir a um objeto da classe base ou da classe derivada. Mas, o comportamento da chamada de método pode ser ambíguo se os métodos da classe base forem substituídos. Portanto, para resolver essa ambiguidade, a palavra-chave Virtual é usada. Se o método estiver marcado como Virtual, então a função da classe derivada é chamada (se houver) ou então a função da classe base é chamada. Por exemplo, em C++, a palavra-chave Virtual é usada exatamente para essa finalidade. Em C, a palavra-chave Virtual é usada de maneira semelhante, mas, além disso, a substituição da palavra-chave deve ser usada para modificar todos os métodos substituídos. Mas em Java, não há uma palavra-chave Virtual explícita. Todos os métodos não estáticos são considerados virtuais. Funções virtuais sem corpo são chamadas de funções virtuais puras. Em Java e C, métodos abstratos são de fato Pure Virtual.
Diferença entre Virtual e Abstrato
Embora Abstract e Virtual sejam duas palavras-chave/conceitos que fornecem um significado de implementação incompleta para suas entidades associadas, elas têm suas diferenças. Métodos abstratos (que devem ser definidos dentro de classes abstratas) não possuem nenhuma implementação, enquanto métodos virtuais podem ter uma implementação. Se os métodos abstratos forem estendidos por uma classe concreta, todos os métodos abstratos herdados devem ser implementados, enquanto os métodos virtuais herdados podem ou não ser substituídos.