¿Para qué se utiliza la palabra clave ‘sobrescribir’ en C ++?

Soy un principiante en C ++. Me he encontrado con la palabra clave de override utilizada en el archivo de encabezado en el que estoy trabajando. Que yo sepa, cuál es el uso real de la override , tal vez con un ejemplo sería fácil de entender.

La palabra clave de override tiene dos propósitos:

  1. Muestra al lector del código que “este es un método virtual, que está reemplazando un método virtual de la clase base”.
  2. El comstackdor también sabe que es una anulación, por lo que puede “verificar” que no está modificando / agregando nuevos métodos que 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 comstackdor emitirá un error para “cambiar el tipo”. Sin override , a lo sumo, el comstackdor daría una advertencia de “está ocultando el método virtual con el mismo nombre”.

Y como anexo 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 más detalles lea 2.11.2 de The Standard .

 // kate: hl C++11; #include  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 de C ++ 11, lo que significa que un método es un “override” 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 comstackción porque B::func1() no invalida A::func1() , definirá un nuevo método llamado func1() lugar.

Wikipedia dice:

La anulación del método, en la progtwigción orientada a objetos, es una característica del lenguaje que permite a una subclase o clase secundaria proporcionar una implementación específica de un método que ya proporciona una de sus superclases o clases primarias.

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 hello ():

 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 anular

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