Virtual vs Resumen
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 pequeñas diferencias en lo que significa en diferentes idiomas, tanto las palabras clave virtuales como las abstractas proporcionan un sentido de implementación parcial a las entidades a las que se adjunta..
Resumen
Normalmente, las clases abstractas, también conocidas como clases base abstractas (ABC), no se pueden crear instancias (no se puede crear una instancia de esa clase). Por lo tanto, las clases abstractas solo tienen significado si el lenguaje de programación admite la herencia (capacidad para crear subclases a partir de la extensión de una clase). Las clases abstractas generalmente representan un concepto abstracto o entidad con implementación parcial o nula. Por lo tanto, las clases abstractas actúan como clases primarias de las que se derivan las clases secundarias, de modo que la clase secundaria compartirá las características incompletas de la clase principal y se pueden agregar funciones 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 secundaria implementa todos estos métodos abstractos, es una clase concreta. Pero si no lo hace, la clase infantil también se convierte en una clase abstracta. Lo que todo esto significa es que, cuando el programador designa una clase como Resumen, está diciendo que la clase estará incompleta y tendrá elementos que las subclases hereditarias deben completar. Esta es una buena forma de crear un contrato entre dos programadores, lo que simplifica las tareas en el desarrollo de software. El programador, que escribe el código para heredar, necesita seguir las definiciones de los métodos exactamente (pero, por supuesto, puede tener su propia implementación). En Java y C #, las clases y métodos abstractos se declaran usando la palabra clave Abstract.
Virtual
Los métodos / funciones virtuales proporcionan la capacidad de anular opcionalmente su comportamiento mediante una clase hereditaria (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 de una clase secundaria, luego, cuando se usa un objeto de la clase derivada, puede referirse a un objeto de la clase base o la clase derivada. Sin embargo, el comportamiento de las llamadas a los métodos puede ser ambiguo si los métodos de la clase base están anulados. Entonces, para resolver esta ambigüedad, se utiliza la palabra clave virtual. Si el método está marcado como Virtual, se llama a la función de la clase derivada (si existe) o, si no, 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 modificación de la palabra clave se debe usar para modificar todos los métodos sobrescritos. 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 denominan funciones virtuales puras. En Java y C #, los métodos abstractos son de hecho Pure Virtual.
Diferencia entre virtual y abstracto
Aunque Resumen y Virtual son dos palabras clave / conceptos que proporcionan un significado de implementación incompleta a sus entidades asociadas, tienen sus diferencias. Los métodos abstractos (que deben definirse dentro de las clases abstractas) no tienen ninguna implementación, mientras que los métodos virtuales pueden tener una implementación. Si los métodos abstractos son extendidos por una clase concreta, todos los métodos abstractos heredados deben implementarse, mientras que los métodos virtuales heredados pueden o no pueden ser anulados.