O que significa override em C++ ?

C++ é mais complexo do que imaginamos.


O que significa override em C++ ?

Nós já sabemos que podemos sobrecarregar(overload) as funções e funções-membro em C++ assim como vimos no Curso de C++ Moderno Avançado.

Mas nesse cpp::daily de hoje vamos ver para que serve a palavra chave override e também final .

Conceito

override é utilizado para especificar que uma função virtual substitui outra função virtual.

Em uma declaração ou definição de função-membro, o especificador de substituição garante que a função é virtual e está substituindo uma função virtual de uma classe base. O programa está mal formado (um erro de tempo de compilação é gerado) se isso não for verdade.

override é um identificador com um significado especial quando usado após declaradores de função de membro: caso contrário, não é uma palavra-chave reservada.

Supondo que você a seguinte struct ou classe com o seguinte conteúdo:

#include <iostream>

struct Base {
  virtual void foo(){
    std::cout << "Eu sou a foo!" << '\n';
  }

  void bar(){
    std::cout << "Eu sou a bar" << '\n';
  }
};

struct Derivada : Base {
  virtual void foo(){
    std::cout << "Eu sou a foo 2!" << '\n';
  }

  void bar(){
    std::cout << "Eu sou a bar 2!" << '\n';
  }
};

int main(){
  Derivada d;
  d.foo();
  d.bar();
  return 0;
}

Isso compila normalmente mesmo se tornarmos a foo() da Derivada como override, exemplo:

virtual void foo() override{
  std::cout << "Eu sou a foo 2!" << '\n';
}

Mesmo se você ainda altere para const:

virtual void foo() const {
  std::cout << "Eu sou a foo 2!" << '\n';
}

Mas se você torná-la como const override ou a bar() como override o compilador não deixará passar.

struct Derivada : Base {
  virtual void foo() const{
    std::cout << "Eu sou a foo 2!" << '\n';
  }

  void bar() override{
    std::cout << "Eu sou a bar 2!" << '\n';
  }
};

Mas se você tiver uma nova herdeira(neta) e a filha declarada como final e tentar reutilizá-la, essa substituição não será possível:

#include <iostream>

struct Base {
  virtual void foo(){
    std::cout << "Eu sou a foo!" << '\n';
  }

  void bar(){
    std::cout << "Eu sou a bar" << '\n';
  }
};

struct Derivada : Base {
  virtual void foo() final{
    std::cout << "Eu sou a foo 2!" << '\n';
  }

  void bar() {
    std::cout << "Eu sou a bar 2!" << '\n';
  }
};

struct Outra : Derivada {
  virtual void foo() {
    std::cout << "Eu sou a foo 2!" << '\n';
  }

  void bar() {
    std::cout << "Eu sou a bar 2!" << '\n';
  }
};

int main(){
  Derivada d;
  d.foo();
  d.bar();
  return 0;
}

Saída: overriding final function

error: virtual function ‘virtual void Outra::foo()’ overriding final function
virtual void foo() {
             ^~~
note: overridden function is ‘virtual void Derivada::foo()’
virtual void foo() final{


Tá, legal! Mas pra que serve isso ??? Só pra exibir erro ? Não, isso foi implementado no C++11 com intuito de tornar seu código limpo, porque você queria criar uma função que duplicasse conteúdo existente? Iria “sobrecarregar”, não é?! Então você pode descobrir se está ou não “reinventando a roda” simplesmente utilizando override.

Não tão simples de entender, mas fácil de perceber, né?!


Por hoje é só, são pequenas doses diárias que farão sempre nos manter antenado com o C++ !

Acompanhe o cpp::daily

Deseja aprender C++ e criar seus programas Gráficos e para Terminal com portabilidade para Linux e Windows?

Então se inscreva nos nossos Cursos de C++ Moderno . Você aprender criar:

Acesse o endereço:

https://terminalroot.com.br/cpp/ e saiba mais!



cppdaily


Compartilhe


Nosso canal no Youtube

Inscreva-se


Marcos Oliveira

Marcos Oliveira

Desenvolvedor de software
https://github.com/terroo


Crie Aplicativos Gráficos para Linux e Windows com C++

Aprenda C++ Moderno e crie Games, Programas CLI, GUI e TUI de forma fácil.

Saiba Mais

Receba as novidades no seu e-mail!

Após cadastro e confirmação do e-mail, enviaremos semanalmente resumos e também sempre que houver novidades por aqui para que você mantenha-se atualizado!