2010-04-16 27 views
144

Duplicar posibles:
C++ Virtual/Pure Virtual Explaineddiferencia entre una función virtual y una función virtual pura

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

sé "función virtual pura es una función virtual sin cuerpo", pero ¿qué significa esto y lo que se hace por la línea de abajo:

virtual void virtualfunctioname() = 0 
+1

"una función virtual sin cuerpo"> eso es incorrecto. ellos pueden tener mucho cuerpo. –

Respuesta

189

Una función virtual hace que su clase sea 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, el dinámico tipo del objeto se utiliza 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; 
    // ... 

Un la función virtual pura implícitamente hace que la clase esté definida para abstract (a diferencia de Java donde tienes una palabra clave para declarar explícitamente el resumen de 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. (What that's good for is debatable.)


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

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

Ver this question y this one para obtener más información sobre este uso de delete y default.

+2

Ah, entonces una función virtual pura es casi lo mismo que un método en las interfaces Java/C#. Ordenado. –

+2

@Nick: De hecho. Solo que C++ te da más libertad al respecto. (Puede implementar funciones virtuales puras en C++ y puede mezclar funciones puras, no puras y no virtuales en la misma clase. (Por lo general, es una buena idea no hacer eso, pero si lo necesita, puede hacerlo).) – sbi

+0

@Sbi Creo que el punto de suposición de "use = 0 para funciones virtuales puras" vale la pena irse. Quizás incluso agregar al final "En resumen, si quieres la función virtual pura, usa' = 0' " – thecoshman

13

Una función virtual pura no suele ser (pero se puede) implementar en una clase base y se debe implementar en una subclase de hoja.

Usted indica que este hecho añadiendo el "= 0" a la declaración, así:

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

entonces no se puede declarar y crear una instancia de una subclase sin que la implementación de 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.

+3

En C++, se puede implementar una función virtual pura. – sbi

+2

sí, y para el destructor virtual puro, debe implementarse. – daramarak

+0

@daramarak: constructor virtual puro? en C++? – Naveen

23

Para una función virtual, debe proporcionar la 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 una función 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 puede crear un objeto de esta clase.

Cuestiones relacionadas