Pregunta

¿Cuál es la diferencia entre las siguientes dos declaraciones?

virtual void calculateBase() = 0;  
virtual void calculateBase();

Leí que el primero (= 0) es una " función abstracta pura " pero, ¿qué hace eso el segundo?

¿Fue útil?

Solución

La primera se llama función virtual pura. Normalmente, las funciones virtuales puras no tendrán ninguna implementación y no puede crear una instancia de una clase que contenga una función virtual pura.

La segunda es una función virtual (es decir, una función virtual 'normal'). Una clase proporciona la implementación para esta función, pero su clase derivada puede anular esta implementación al proporcionar su propia implementación para este método.

Otros consejos

El primero es un "virtual puro" - hará que la clase sea abstracta, al intentar instanciarla se generarán errores de compilación. Está destinado a ser utilizado como una clase base donde la clase derivada implementa el comportamiento necesario mediante la implementación de la función virtual pura. No puede implementar la función en la clase base, aunque puede hacerlo.
Este es un patrón utilizado a menudo para dos patrones de diseño:

  • El " plantilla método " patrón de diseño, donde la clase base implementa una estructura alrededor una llamada a función, pero los detalles de la llamada a función deben ser completados por la clase derivada y
  • La " interfaz " patrón de diseño, porque C ++ no tiene la palabra clave de interfaz. Las clases base abstractas, idealmente con funciones virtuales puras y sin datos de miembros, son la forma C ++ de definir interfaces.

La segunda declaración es solo una declaración de función de miembro virtual ordinaria. Obtendrá errores de compilación si no implementa la función miembro en la clase base. Todavía es virtual, lo que implica que puede ser útil anular el comportamiento en una clase derivada.

El primero no tiene que implementarse en la clase base, pero exige que se implemente en clases heredadas.

Debe implementar el segundo en la clase base y puede implementarse en clases heredadas.

Básicamente, al heredar, está obligado a anular el primero y se le permite anular el segundo.

Viniendo de Java, ¿no?

Creo que estás mezclando términos ...

virtual void x() = 0;

es una función virtual pura , o función abstracta. Es una función virtual sin implementación. Habla de una clase abstracta pura, que es el equivalente en c ++ de una interfaz, acerca de una clase que solo tiene funciones abstractas.

virtual void x();

es una función virtual, lo que significa que se puede redefinir en clases derivadas, pero no es abstracta, por lo que debe proporcionar una implementación para ella.

  

virtual void CalculateBase () = 0;

La primera función es la función virtual pura donde la implementación no se puede hacer en la clase y actúa como clase abstracta pura o clase de interfaz. La implementación concreta debe hacerse o anularse en la subclase. Actúa como clase de interfaz para sus clases derivadas.

  

virtual void CalculateBase ();

Esta función es una función virtual donde la implementación (predeterminada) se puede realizar en la clase base. Pero, la clase derivada debe reemplazar su propia implementación.

En Java

virtual void calculateBase() = 0;  

sería

abstract void calculateBase();

y

virtual void calculateBase();

sería

void calculateBase();

Para ser perfectamente claro,

final void calculateBase();

en C ++, es "lo mismo" como

<*>

en Java. Es decir, final es " default " en C ++. Sin embargo, hay una excepción a esta regla. Al subclasificar una clase con un método virtual y volver a implementarla sin usar la palabra clave virtual, el método en la subclase no será final.

La segunda función debe tener una implementación en la clase que la declare (falta de '= 0'), y puede ser reemplazada por subclases.

La primera función puede tener o no una implementación en la clase que la declara, y tiene que ser implementada por subclases

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top