yoast titulo name keywords google etiquetas ejemplos description c++ c++11 override method-overriding

c++ - titulo - seo html



¿Para qué se utiliza la palabra clave ''anular'' en C++? (4)

La palabra clave de override sirve para dos propósitos:

  1. Muestra al lector del código que "este es un método virtual, que está anulando un método virtual de la clase base".
  2. El compilador también sabe que se trata de una anulación, por lo que puede "verificar" que no está alterando / agregando nuevos métodos que usted cree que son anulaciones.

Para explicar esto último:

class base { public: virtual int foo(float x) = 0; }; class derived: public base { public: int foo(float x) override { ... do stuff with x and such ... } } class derived2: public base { public: int foo(int x) override { ... } };

En derived2 el compilador emitirá un error para "cambiar el tipo". Sin override , a lo sumo el compilador daría una advertencia para "está ocultando el método virtual con el mismo nombre".

Esta pregunta ya tiene una respuesta aquí:

Soy un principiante en C ++. Me encontré con la palabra clave override utilizada en el archivo de encabezado en el que estoy trabajando. Puedo saber, qué es el uso real de la override , quizás con un ejemplo sería fácil de entender.


Wikipedia dice:

La sobrescritura de métodos, en la programación orientada a objetos, es una función de lenguaje que permite que una subclase o clase secundaria proporcione una implementación específica de un método que ya está provisto por una de sus superclases o clases principales.

En detalle, cuando tienes un objeto foo que tiene una función void hello ():

class foo { virtual void hello(); // Code : printf("Hello!"); }

Un hijo de foo, también tendrá una función de hola ():

class bar : foo { // no functions in here but yet, you can call // bar.hello() }

Sin embargo, es posible que desee imprimir "Hello Bar!" cuando se llama a la función hello () desde un objeto de barra. Puedes hacer esto usando la anulación

class bar : foo { virtual void hello() override; // Code : printf("Hello Bar!"); }


y como una adición a todas las respuestas, FYI: override no es una palabra clave , ¡sino un tipo especial de identificador! Tiene significado solo en el contexto de declarar / definir funciones virtuales, en otros contextos es solo un identificador ordinal. Para detalles, lea 2.11.2 de The Standard .

// kate: hl C++11; #include <iostream> struct base { virtual void foo() = 0; }; struct derived : base { virtual void foo() override { std::cout << __PRETTY_FUNCTION__ << std::endl; } }; int main() { base* override = new derived(); override->foo(); return 0; }

Salida:

zaufi@gentop /work/tests $ g++ -std=c++11 -o override-test override-test.cc zaufi@gentop /work/tests $ ./override-test virtual void derived::foo()


override es una palabra clave C ++ 11 que significa que un método es una "anulación" de un método de una clase base. Considera este ejemplo:

class Foo { public: virtual void func1(); } class Bar : public Foo { public: void func1() override; }

Si la firma B :: func1 () no es igual a la firma A :: func1 () se generará un error de compilación porque B :: func1 () no anula A :: func1 (), definirá un nuevo método llamado func1 () en cambio.