Avec la définition structurée donnée ci-dessous...
struct A {
virtual void hello() = 0;
};
Approche n° 1 :
struct B : public A {
virtual void hello() { ... }
};
Approche n°2 :
struct B : public A {
void hello() { ... }
};
Y a-t-il une différence entre ces deux façons de remplacer la fonction hello ?
70 votes
En C++11, vous pouvez écrire "void hello() override {}" pour déclarer explicitement que vous surchargez une méthode virtuelle. Le compilateur échouera si une méthode virtuelle de base n'existe pas, et cela a la même lisibilité que de placer "virtual" sur la classe descendante.
0 votes
En fait, dans le C++11 de gcc, écrire void hello() override {} dans la classe dérivée ne pose pas de problème car la classe de base a spécifié que la méthode hello() est virtuelle. En d'autres termes, l'utilisation du mot virtual dans l'expression dérivé de n'est pas nécessaire/obligatoire, pour gcc/g++ en tout cas. (J'utilise gcc version 4.9.2 sur une RPi 3) Mais c'est une bonne pratique d'inclure le mot-clé virtual dans la méthode de la classe dérivée de toute façon.