virtuales que puro polimorfismo objeto modificador herencia funciones clase abstracta c++ pure-virtual

que - C++ función virtual pura tiene cuerpo



polimorfismo puro c++ (3)

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 en absoluto?


"C ++ efectivo" Meyers menciona una razón 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 en cualquier lugar de su código. Si parte del código de dos clases derivadas diferentes es similar, entonces tiene sentido moverlo hacia arriba en la jerarquía, incluso si la función debería ser virtual.

ver here


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

  • El "virtual puro" es requerir que las clases derivadas implementen su destructor.
  • Su implementación de destructor de clase base es para que los destructores de clase derivados puedan "encadenar" con éxito después.

Su suposición de que la función virtual pura no puede ser llamada es absolutamente incorrecta. Cuando una función se declara virtual pura, simplemente significa que esta función no puede ser llamada dinámicamente , a través de un mecanismo de envío virtual. Sin embargo, esta misma función se puede llamar fácilmente estática , no virtualmente , 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 la función especificado en la llamada tiene el formato <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` }