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:
- Muestra al lector del código que "este es un método virtual, que está anulando un método virtual de la clase base".
- 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.