Virtual vs Abstract
Virtual y Abstract son dos palabras clave utilizadas en la mayoría de los lenguajes de programación orientados a objetos (OO) como Java y C#. Aunque existen ligeras diferencias en lo que significa en diferentes idiomas, las palabras clave virtuales y abstractas proporcionan un sentido de implementación parcial a las entidades a las que atribuye.
Abstracto
Por lo general, las clases abstractas, también conocidas como clases base abstractas (ABC), no se pueden instanciar (no se puede crear una instancia de esa clase). Por lo tanto, las clases abstractas solo son significativas si el lenguaje de programación admite la herencia (la capacidad de crear subclases para extender una clase). Las clases abstractas generalmente representan un concepto o entidad abstracta con implementación parcial o nula. Por lo tanto, las clases abstractas actúan como clases principales de las cuales se derivan las clases de niños, de modo que la clase infantil compartirá las características incompletas de la clase y la funcionalidad de los padres para completarlas para completarlas. Las clases abstractas pueden contener métodos abstractos. Las subclases que extienden una clase abstracta pueden implementar estos métodos abstractos (heredados). Si la clase infantil implementa todos estos métodos abstractos, es una clase concreta. Pero si no es así, la clase infantil también se convierte en una clase abstracta. Lo que esto significa es que, cuando el programador nomine a una clase como resumen, dice que la clase estará incompleta y tendrá elementos que deben completarse con las subclases heredadas. Esta es una buena manera de crear un contrato entre dos programadores, lo que simplifica las tareas en el desarrollo de software. El programador, que escribe código para heredar, necesita seguir las definiciones de métodos exactamente (pero, por supuesto, puede tener su propia implementación). En Java y C#, se declaran clases y métodos abstractos utilizando la palabra clave abstracta.
Virtual
Los métodos/funciones virtuales proporcionan la capacidad de anular opcionalmente su comportamiento mediante una clase heredadora (utilizando una función con la misma firma). El concepto de función virtual es importante en el siguiente escenario. Supongamos que una clase es derivada por una clase infantil, luego, cada vez que se usa un objeto de la clase derivada, puede referirse a un objeto de la clase base o la clase derivada. Pero, el comportamiento de la llamada del método puede ser ambiguo si los métodos de clase base están anulados. Entonces, para resolver esta ambigüedad, se usa la palabra clave virtual. Si el método está marcado virtual, entonces se llama la función de la clase derivada (si corresponde) o de lo contrario se llama a la función de la clase base. Por ejemplo, en C ++, la palabra clave virtual se usa exactamente para este propósito. En C#, la palabra clave virtual se usa de manera similar, pero además, la anulación de palabras clave debe usarse para modificar todos los métodos anulados. Pero en Java, no hay una palabra clave virtual explícita. Todos los métodos no estáticos se consideran virtuales. Las funciones virtuales sin cuerpo se llaman funciones virtuales puras. En Java y C#, los métodos abstractos son de hecho puro virtual.
Diferencia entre virtual y abstracto
Aunque los abstractos y virtuales son dos palabras clave/conceptos que proporcionan un significado de implementación incompleta a sus entidades asociadas, sí tienen sus diferencias. Los métodos abstractos (que deben definirse dentro de las clases abstractas) no tienen una implementación en absoluto, mientras que los métodos virtuales pueden tener una implementación. Si los métodos abstractos se extienden por una clase concreta, se deben implementar todos los métodos abstractos heredados, mientras que los métodos virtuales heredados pueden o no ser anulados o no.