Eu sou um iniciante em C ++. Eu vi a palavra-chave override
usada no arquivo de header no qual estou trabalhando. Posso saber, qual é o uso real da override
, talvez com um exemplo seria fácil de entender.
A palavra-chave override
tem dois propósitos:
Para explicar o ú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 { ... } };
Em derived2
o compilador emitirá um erro para “alterar o tipo”. Sem override
, no máximo, o compilador daria um aviso para “você está ocultando o método virtual pelo mesmo nome”.
e como adendo a todas as respostas, FYI: override
não é uma palavra-chave , mas um tipo especial de identificador! Tem significado apenas no contexto de declarar / definir funções virtuais, em outros contextos é apenas um identificador ordinal. Para detalhes, leia 2.11.2 do Padrão .
// 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; }
Saída:
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
é uma palavra-chave do C ++ 11 que significa que um método é uma “substituição” de um método de uma class base. Considere este exemplo:
class Foo { public: virtual void func1(); } class Bar : public Foo { public: void func1() override; }
Se a assinatura B::func1()
não for igual à assinatura A::func1()
um erro de compilation será gerado porque B::func1()
não sobrescreve A::func1()
, ele irá definir um novo método chamado func1()
vez disso.
Wikipedia diz:
A substituição de methods, em programação orientada a objects, é um recurso de linguagem que permite que uma subclass ou class-filha forneça uma implementação específica de um método que já é fornecido por uma de suas superclasss ou classs-pai.
Em detalhe, quando você tem um object foo que tem uma function void hello ():
class foo { virtual void hello(); // Code : printf("Hello!"); }
Um filho de foo, também terá uma function hello ():
class bar : foo { // no functions in here but yet, you can call // bar.hello() }
No entanto, você pode querer imprimir “Hello Bar!” quando a function hello () está sendo chamada de um object de barra. Você pode fazer isso usando override
class bar : foo { virtual void hello() override; // Code : printf("Hello Bar!"); }