Diferencia entre una función virtual y una función virtual pura

Posible duplicado:
C ++ Virtual / Pure Virtual Explained

¿Cuál es la diferencia entre una función virtual pura y una función virtual?

Sé que “la función virtual pura es una función virtual sin cuerpo”, pero ¿qué significa esto y qué hace la línea siguiente?

virtual void virtualfunctioname() = 0 

Una función virtual hace que su clase sea una clase base polimórfica . Las clases derivadas pueden anular las funciones virtuales. Las funciones virtuales llamadas a través de referencias / referencias de clase base se resolverán en tiempo de ejecución. Es decir, se utiliza el tipo dynamic del objeto en lugar de su tipo estático :

  Derived d; Base& rb = d; // if Base::f() is virtual and Derived overrides it, Derived::f() will be called rb.f(); 

Una función virtual pura es una función virtual cuya statement termina en =0 :

 class Base { // ... virtual void f() = 0; // ... 

Una función virtual pura implícitamente hace que la clase se defina como abstracta (a diferencia de Java, donde se tiene una palabra clave para declarar explícitamente el resumen de la clase). Las clases abstractas no pueden ser instanciadas. Las clases derivadas deben sobrescribir / implementar todas las funciones virtuales puras heredadas. Si no lo hacen, ellos también se volverán abstractos.

Una “característica” interesante de C ++ es que una clase puede definir una función virtual pura que tiene una implementación. ( Lo que es bueno para es discutible )


Tenga en cuenta que C ++ 11 trajo un nuevo uso para las palabras clave de delete y default que se parece a la syntax de las funciones virtuales puras:

 my_class(my_class const &) = delete; my_class& operator=(const my_class&) = default; 

Consulte esta pregunta y esta para obtener más información sobre este uso de delete y default .

Para una función virtual, debe proporcionar implementación en la clase base. Sin embargo, la clase derivada puede anular esta implementación con su propia implementación. Normalmente, para funciones virtuales puras no se proporciona implementación. Puede hacer que una función sea puramente virtual con =0 al final de la statement de la función. Además, una clase que contiene una función virtual pura es abstracta, es decir, no puede crear un objeto de esta clase.

Una función virtual pura generalmente no se implementa (pero se puede) en una clase base y debe implementarse en una subclase de hoja.

Usted denota ese hecho al agregar el “= 0” a la statement, así:

 class AbstractBase { virtual void PureVirtualFunction() = 0; } 

Entonces no puede declarar y crear instancias de una subclase sin que implemente la función virtual pura:

 class Derived : public AbstractBase { virtual void PureVirtualFunction() override { } } 

Al agregar la palabra clave override , el comstackdor se asegurará de que haya una función virtual de clase base con la misma firma.

En realidad, puede proporcionar implementaciones de funciones virtuales puras en C ++. La única diferencia es que todas las funciones virtuales deben ser implementadas por clases derivadas antes de que la clase pueda ser instanciada.