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.
- « override » en c ++11 (3 réponses )
Réponses
Trop de publicités?Les override
Le mot-clé a deux fonctions :
- 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.
- 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".
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()
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.
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!");
};