309 votes

À quoi sert le mot-clé "override" en C++ ?

Je suis un débutant en C++. J'ai rencontré override utilisé dans le fichier d'en-tête sur lequel je travaille. Puis-je savoir quelle est l'utilisation réelle de override Un exemple serait plus facile à comprendre.

481voto

Mats Petersson Points 70074

Les override Le mot-clé a deux fonctions :

  1. Il indique au lecteur du code qu'il s'agit d'une méthode virtuelle, qui surcharge une méthode virtuelle de la classe de base.
  2. Le compilateur sait également qu'il s'agit d'une surcharge, il peut donc "vérifier" que vous ne modifiez pas ou n'ajoutez pas de nouvelles méthodes que vous pensez être des surcharges.

Pour expliquer ce dernier point :

class base
{
  public:
    virtual int foo(float x) = 0; 
};

class derived: public base
{
   public:
     int foo(float x) override { ... } // OK
};

class derived2: public base
{
   public:
     int foo(int x) override { ... } // ERROR
};

En derived2 le compilateur émettra une erreur pour "changement de type". Sans override Tout au plus le compilateur émettra-t-il un avertissement du type "vous cachez une méthode virtuelle portant le même nom".

87voto

zaufi Points 1837

Et en complément de toutes les réponses, pour information : override n'est pas un mot-clé mais un spécial type d'identificateur ! Il n'a de sens que dans le contexte de la déclaration/définition des fonctions virtuelles. identifiant . Pour plus de détails, voir 2.11.2 de L'étalon .

#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;
}

Sortie :

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

12voto

xorguy Points 1440

override est un mot-clé du C++11 qui signifie qu'une méthode est une "surcharge" d'une méthode d'une classe de base. Prenons l'exemple suivant :

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

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

Si B::func1() la signature n'est pas égale à A::func1() signature, une erreur de compilation sera générée car B::func1() n'a pas la priorité sur A::func1() il définira une nouvelle méthode appelée func1() au lieu de cela.

0voto

Wikipedia dit :

Dans la programmation orientée objet, la surcharge de méthode est une fonctionnalité du langage qui permet à une sous-classe ou à une classe enfant de fournir une implémentation spécifique d'une méthode qui est déjà fournie par l'une de ses superclasses ou de ses classes mères.

En détail, lorsque vous avez un objet foo qui a une fonction void hello() :

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

Un enfant de foo aura également une fonction hello() :

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

Cependant, il se peut que vous souhaitiez imprimer "Hello Bar !" lorsque la fonction hello() est appelée à partir d'un objet bar. Vous pouvez le faire en utilisant la fonction override

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X