virtuales que puro puras polimorfismo objeto modificador herencia funciones c++ c++11 inheritance override virtual-method

c++ - que - ¿La palabra clave ''anular'' es solo una verificación de un método virtual anulado?



polimorfismo puro c++ (4)

Cita de Wikipedia:

El identificador especial de anulación significa que el compilador verificará la (s) clase (s) base para ver si hay una función virtual con esta firma exacta. Y si no existe, el compilador saldrá de error.

http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_overrides_and_final

Editar (intentando mejorar un poco la respuesta):

Declarar un método como "anular" significa que ese método está destinado a reescribir un método (virtual) en la clase base. El método principal debe tener la misma firma (al menos para los parámetros de entrada) que el método que intenta reescribir.

¿Por qué es esto necesario? Bueno, los siguientes dos casos de error comunes se previenen:

  1. un tipo de mistypes en el nuevo método. El compilador, sin saber que tiene la intención de escribir un método anterior, simplemente lo agrega a la clase como un nuevo método. El problema es que el método anterior todavía está allí, el nuevo se agrega solo como una sobrecarga. En este caso, todas las llamadas al viejo método funcionarán igual que antes, sin ningún cambio en el comportamiento (que habría sido el verdadero propósito de la reescritura).

  2. uno se olvida de declarar el método en la superclase como "virtual", pero aún intenta volver a escribirlo en una subclase. Si bien esto será aparentemente aceptado, el comportamiento no será exactamente el esperado: el método no es virtual, por lo que el acceso mediante punteros a la superclase terminará llamando al método antiguo (superclase) en lugar del método nuevo (subclase '').

Agregar "anular" claramente desambigua esto: a través de esto, uno le dice al compilador que hay tres cosas que están esperando:

  1. hay un método con el mismo nombre en la superclase
  2. este método en la superclase se declara como "virtual" (es decir, destinado a ser reescrito)
  3. el método en la superclase tiene la misma firma (entrada *) que el método en la subclase (el método de reescritura)

Si alguno de estos es falso, se indica un error.

* nota: el parámetro de salida es a veces de tipo diferente, pero relacionado. Lea sobre transformaciones covariantes y contravariantes si está interesado.

Por lo que entiendo, la introducción de la palabra clave override en C ++ 11 no es más que una verificación para asegurarse de que la función que se está implementando sea la override de una función virtual en la clase base.

¿Es asi?


Esa es de hecho la idea. El punto es que eres explícito sobre lo que quieres decir, para poder diagnosticar un error por lo demás silencioso:

struct Base { virtual int foo() const; }; struct Derived : Base { virtual int foo() // whoops! { // ... } };

El código anterior se compila, pero no es lo que usted puede haber querido decir (tenga en cuenta la falta de const ). Si dijera en cambio, virtual int foo() override , entonces obtendría un error de compilación de que su función de hecho no está anulando nada.


La " anulación " encontrada es útil cuando alguien actualizó la firma del método virtual de la clase base, como agregar un parámetro opcional, pero olvidó actualizar la firma del método de clase derivado. En ese caso, los métodos entre la base y la clase derivada ya no son una relación polimórfica. Sin la declaración de anulación, es difícil descubrir este tipo de error.