C ++ función virtual pura tiene cuerpo

Las funciones virtuales puras (cuando establecemos = 0 ) también pueden tener un cuerpo de función.

¿Cuál es el uso para proporcionar un cuerpo de función para funciones virtuales puras, si no se van a llamar?

Su suposición de que no se puede llamar a la función virtual pura es absolutamente incorrecta. Cuando una función se declara puramente virtual, simplemente significa que esta función no se puede llamar dinámicamente , a través de un mecanismo de despacho virtual. Sin embargo, esta misma función se puede llamar fácilmente de forma estática , no virtual , directamente (sin despacho virtual).

En el lenguaje C ++, se realiza una llamada no virtual a una función virtual 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 :: .

Por ejemplo

 struct S { virtual void foo() = 0; }; void S::foo() { // body for pure virtual function `S::foo` } struct D : S { void foo() { S::foo(); // Non-virtual call to `S::foo` from derived class this->S::foo(); // Alternative syntax to perform the same non-virtual call // to `S::foo` from derived class } }; int main() { D d; dS::foo(); // Another non-virtual call to `S::foo` } 

“C ++ efectivo” Meyers menciona un motivo para que una función virtual pura tenga un cuerpo: las clases derivadas que implementan esta función virtual pura pueden llamar a esta implementación smwhere en su código. Si parte del código de dos clases derivadas diferentes es similar, tiene sentido moverlo hacia arriba en la jerarquía, incluso si la función debe ser puramente virtual.

mira aquí

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

  • El “puro virtual” es requerir 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.