2011-03-30 13 views
37

funciones virtuales puras (cuando fijamos = 0) también pueden tener un cuerpo de la función.función virtual pura C++ tienen cuerpo

¿Cuál es el uso para proporcionar un cuerpo de función para funciones virtuales puras, si no van las llaman en absoluto?

+0

posible duplicado de [función virtual pura con la aplicación] (http://stackoverflow.com/questions/2089083/pure-virtual-function-with-implementation) –

+0

Lo sentimos! Soy algo nuevo en términos en estos foros. He aceptado las respuestas a lo que consideré correcto. gracias por las sugerencias – Vijay

+0

duplicado posible de [función virtual pura con la aplicación] (https://stackoverflow.com/questions/2089083/pure-virtual-function-with-implementation) – finnw

Respuesta

59

Su suposición de que la función virtual pura no puede ser llamado es absolutamente incorrecto. Cuando una función se declara puramente virtual, simplemente significa que esta función no puede llamarse dinámicamente, a través de un mecanismo de despacho virtual. Sin embargo, esta misma función se puede llamar fácilmente estáticamente, sin despacho virtual.

En lenguaje C++, la llamada estática a una función virtual se realiza cuando se utiliza un nombre calificado de la función en la llamada, es decir, cuando el nombre de función especificado en la llamada tiene el formulario <class name>::<function name>.

Por ejemplo

struct S { 
    virtual void foo() = 0; 
}; 

void S::foo() { 
    // body for the pure virtual function `S::foo` 
} 

struct D : S { 
    void foo() { 
    S::foo(); // static call to `S::foo` from derived class 
    } 
}; 

int main() { 
    D d; 
    d.S::foo(); // another static call to `S::foo` 
} 
4

Para la mayoría de las funciones virtuales puras, estaríamos en lo cierto. Sin embargo, para un destructor virtual puro, es realmente importante definir una implementación de destructor correspondiente:

  • El "puro virtual" requiere clases derivadas para implementar su destructor.
  • La implementación de su destructor de clase base es para que los destructores de clase derivados puedan "encadenarse" posteriormente con éxito.
+8

(me di cuenta que esta respuesta es un año de edad, pero acabo de visto un enlace que hace referencia a personas a esta pregunta, así que ...) Su primer punto es incorrecto, un destructor virtual puro no fuerza a las clases derivadas a implementar un destructor. La clase derivada siempre tendrá un destructor, incluso si está implícitamente definido. Una ventaja de un destructor virtual puro es hacer una clase abstracta si no tiene otras funciones adecuadas para ser puramente virtual. –

19

"Eficaz C++" Meyers menciona una razón para una función virtual pura a tener un cuerpo: Derivado clases que implementan esta función virtual pura puede llamar a esta aplicación smwhere en su código. Si parte del código de dos clases derivadas diferentes es similares, entonces tiene sentido para moverlo arriba en la jerarquía, incluso si la función debe ser puro virtual.

ver here.

Cuestiones relacionadas