Solución:
Para tu
class SomeClass{
virtual void aMethod()=0;
}
la presencia de un método virtual puro hace tu clase abstracto. Una vez que tenga uno de esos métodos virtuales puros, =0
, en su clase, no puede crear una instancia de la clase. Es más, cualquier clase derivada debe implementar el virtual puro aMethod()
, o también se convierte en una clase abstracta.
En su clase derivada, sobrescribe el método virtual puro de arriba, y esto hace que la clase derivada no sea abstracta. Puede crear una instancia de esta clase derivada.
Pero, en la clase derivada, el cuerpo del método está vacío, ¿verdad? Es por eso que su pregunta tiene sentido: ¿por qué no hacer que la clase también sea puramente virtual? Bueno, su clase puede implicar otros métodos. Si es así, SomeClass
no se puede crear una instancia (hay un método virtual puro), mientras que la clase secundaria SomeClassSon
puede ser.
Lo mismo se aplica a su AnotherClass
, que se puede instanciar, al contrario de SomeClass
.
La diferencia es que virtual void aMethod() = 0
es un puro función virtual, significa que:
-
SomeClass
se convierte en una clase base abstracta, lo que significa que no se puede instanciar. - Cualquier clase que herede de
SomeClass
debe implementaraMethod
, o también se convierte en una clase base abstracta que no se puede instanciar
Tenga en cuenta que cualquier clase con una o más funciones virtuales puras es automáticamente una clase base abstracta.
El “igual a 0” al que te refieres se llama “pura virtual“. Es una función que el niño que quiere ser instanciado TIENE que implementar en lugar de proporcionar una funcionalidad básica, lo que significa que la clase principal va a definir la funcionalidad que tiene que existir, pero que el padre no tiene conocimiento de cómo lo hará el niño . Tenga en cuenta que esto hace que la clase sea abstracta en el sentido de que no se puede crear una instancia. Por ejemplo, es posible que desee definir una clase “Mamífero” de la que pueda heredar y quiero que sus hijos actúen de cierta manera, pero no puedo simplemente hacer un “Mamífero” En su lugar, crearía una clase de “Jirafa” y me aseguraría de que actúe como se supone que debe hacerlo.
También se explica en esta pregunta SO.
La función “Vacía” a la que se refiere es, en cambio, una funcionalidad en la que la función está definida y se puede llamar, pero no hace nada.