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.
Le mot clé override
remplit deux fonctions:
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".
Et comme additif à toutes les réponses, FYI: override
n’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()
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.
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!");
}