La función virtual pura de C++ tiene cuerpo


Las funciones virtuales puras (cuando configuramos = 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 van a ser llamadas en absoluto?

Author: Kara, 2011-03-30

3 answers

Su suposición de que la función virtual pura no puede ser llamada es absolutamente incorrecta. Cuando una función se declara pura virtual, simplemente significa que esta función no puede ser llamada dinámicamente, a través de un mecanismo de despacho virtual. Sin embargo, esta misma función puede ser llamado estáticamente, no virtualmente, directamente (sin virtual de envío).

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

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;

  d.S::foo(); 
  // Another non-virtual call to `S::foo`
}
 72
Author: AnT,
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
2018-06-06 18:57:09

" C++ efectivo " Meyers menciona un razón para una función virtual pura a tener un cuerpo: Clases derivadas que implementar esta función virtual pura puede llamar a esta implementación smwhere en su código. Si forma parte del código de dos clases derivadas diferentes son similar, entonces tiene sentido para moverlo en la jerarquía, incluso si el la función debe ser pura virtual.

Ver aquí.

 25
Author: Prince John Wesley,
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
2011-03-30 04:51:21

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

  • El "virtual puro" es requerir clases derivadas para implementar su destructor.
  • Su implementación de destructores de clase base es para que los destructores de clase derivados puedan "encadenarse" con éxito después.
 5
Author: Chris Jester-Young,
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
2011-03-30 04:48:07