web-dev-qa-db-fra.com

A quoi sert le mot clé 'override' en C ++?

Je suis débutant en C++. J'ai rencontré le mot clé override utilisé dans le fichier d'en-tête sur lequel je travaille. Puis-je savoir quel est le véritable usage de override? Peut-être qu'un exemple serait facile à comprendre.

173
Sathish Sanjeevi

Le mot clé override remplit deux fonctions:

  1. Il montre au lecteur du code qu'il "s'agit d'une méthode virtuelle, c'est-à-dire qui remplace une méthode virtuelle de la classe de base".
  2. Le compilateur sait également qu'il s'agit d'un remplacement. Il peut donc "vérifier" que vous ne modifiez pas/n'ajoutez pas de nouvelles méthodes que vous pensez être des remplacements.

Pour expliquer ce dernier:

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 { ... } 
};

Dans derived2, le compilateur émettra une erreur pour "changer le type". Sans override, le compilateur donnerait tout au plus un avertissement pour "vous cachez une méthode virtuelle sous le même nom".

274
Mats Petersson

Et comme additif à toutes les réponses, FYI: overriden’est pas un mot-clé, mais un type spécial ! Cela n'a de sens que dans le contexte de la déclaration/définition de fonctions virtuelles, dans d'autres contextes, il s'agit simplement d'un ordinal identifiant. Pour plus de détails, lisez 2.11.2 dans 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;
}

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()
61
zaufi

override est un mot clé C++ 11, ce qui signifie qu'une méthode est un "remplacement" d'une méthode d'une classe de base. Considérons cet exemple:

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

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

Si la signature B::func1() n'égale pas la signature A::func1(), une erreur de compilation est générée car B::func1() ne remplace pas A::func1(), elle définira une nouvelle méthode appelée func1(). au lieu.

8
xorguy

Wikipedia dit:

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

En détail, quand 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, vous voudrez peut-être imprimer "Hello Bar!" lorsque la fonction hello () est appelée à partir d’un objet barre. Vous pouvez le faire en utilisant un remplacement

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