Diferencia entre una función virtual y una función virtual pura [duplicar]


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é se hace realmente por la línea de abajo:

virtual void virtualfunctioname() = 0
Author: Community, 2010-04-16

4 answers

Una función virtual hace su clase a clase base polimórfica. Las clases derivadas pueden anular funciones virtuales. Las funciones virtuales llamadas a través de punteros/referencias de clase base se resolverán en tiempo de ejecución. Es decir, se usa el tipo dinámico 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 declaración termina en =0:

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

Una función virtual pura hace implícitamente la clase que es definido para abstract (a diferencia de Java donde tienes una palabra clave para declarar explícitamente la clase abstract). No se pueden crear instancias de clases abstractas. Las clases derivadas necesitan anular / implementar todas las funciones virtuales puras heredadas. Si no lo hacen, 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. ( Para lo que eso es bueno es discutible.)


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

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

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

 210
Author: sbi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:16

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 la implementación. Puede hacer que una función sea pura virtual con =0 al final de la declaración de la función. Además, una clase que contiene una función virtual pura es abstracta, es decir, no se puede crear un objeto de esta clase.

 25
Author: Naveen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-16 10:38:31

Una función virtual pura generalmente no es (pero puede ser) implementada en una clase base y debe ser implementada en una subclase hoja.

Usted denota ese hecho añadiendo el "= 0 " a la declaración, así:

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

Entonces no puede declarar e instanciar 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 compilador se asegurará de que haya una función virtual de clase base con la misma firma.

 15
Author: Johann Gerell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-08 08:03:46

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

 8
Author: AshleysBrain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:37