A quoi sert le mot-clé 'override' dans C++ ? [dupliquer]
cette question a déjà une réponse ici:
- est-ce que le mot-clé 'override' est juste une vérification pour une méthode virtuelle dépassée? 4 réponses
je suis un débutant en C++. J'ai trouvé le mot-clé override
utilisé dans le fichier d'en-tête sur lequel je travaille. Je sais, ce qui est réel l'utilisation de override
, peut-être avec un exemple serait facile à comprendre.
4 réponses
le mot-clé override
sert à deux fins:
- il montre au lecteur du code que " c'est une méthode virtuelle, qui surpasse une méthode virtuelle de la classe de base."
- le compilateur sait aussi qu'il s'agit d'un override, donc il peut" vérifier " que vous ne modifiez pas/n'ajoutez pas de nouvelles méthodes que vous pensez être des overrides.
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 { ... }
};
In derived2
, le compilateur émet une erreur pour "changer le type". Sans override
, tout au plus le compilateur donnerait un avertissement pour"vous cachez la méthode virtuelle par le même nom".
et comme addendum à toutes les réponses, FYI: 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 de fonctions virtuelles, dans d'autres contextes il s'agit simplement d'un ordinal identifiant . Pour plus de détails, lire 2.11.2 de , la norme .
// 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 qui signifie qu'une méthode est une "override" 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()
signature n'égale pas A::func1()
signature une erreur de compilation sera générée parce que B::func1()
ne supplante pas A::func1()
, il définira une nouvelle méthode appelée func1()
à la place.
Wikipedia dit:
méthode overriding, dans la programmation orientée objet, est une caractéristique de langage qui permet à une sous-classe ou classe enfant de fournir une mise en œuvre spécifique d'une méthode qui est déjà fournie par l'une de ses superclasses ou classes parent.
en détail, lorsque vous avez un objet foo qui a une fonction Hello () vide:
class foo {
virtual void hello(); // Code : printf("Hello!");
}
Un enfant de foo, aura également un fonction hello ():
class bar : foo {
// no functions in here but yet, you can call
// bar.hello()
}
cependant, vous pouvez vouloir imprimer " Hello Bar!"lorsque la fonction hello() est appelée à partir d'une barre d'objet. Vous pouvez le faire en utilisant la commande "override
class bar : foo {
virtual void hello() override; // Code : printf("Hello Bar!");
}