OVH Cloud OVH Cloud

Virtualité

22 réponses
Avatar
Seb
Bonjour,

Je me suis toujours posé la question suivante : pourquoi quand une méthode
est virtuelle, le mot "virtual" est optionnel lors de sa surcharge ?
Personnellement, je trouve que le mettre dans le code est à la fois clair et
pas difficile.

Sébastien

2 réponses

1 2 3
Avatar
Seb
"Philippe Guglielmetti" a écrit dans le message
news: 3f978ae1$0$3655$
d'après les réponses sur comp.lang.c++:
1) beaucoup de compilateurs autres que VC et BC refusent le code
2)
9.4.1 Static member functions
[...] A static member function shall not be virtual. There shall
not be a static and a nonstatic member function with the same name
and the same parameter types (13.1).
n'est pas clair, car les méthodes non statiques ont un paramètre


(this) caché.
On peut donc soit interpréter ce paragraphe comme :
class A {static f() {}; f() {}; }; // est interdit
ou
class A {static f(A*) {}; f() {}; }; // est interdit

3) tout le monde est d'accord pour dire que BC5.5 ne respecte pas la
règle de surcharge des fonctions : dans l'exemple de Seb, C::f doit
être virtuelle car elle surcharge A::f (elle a un paramètre this...)
et non B::f (qui n'en a pas...).
4) "surcharge" ("override") n'est pas le terme exact, il faut dire
"cache" ("hide") dans le cas de méthodes non virtuelles.


En fait, le code doit être refusé, et on ne peut plus dire que C::f
surcharge A::f car ça n'a pas de sens vis à vis de B::f

Sébastien



Avatar
Gabriel Dos Reis
"Philippe Guglielmetti" writes:

| d'après les réponses sur comp.lang.c++:
| 1) beaucoup de compilateurs autres que VC et BC refusent le code
| 2)
| > > 9.4.1 Static member functions
| > > [...] A static member function shall not be virtual. There shall not be
| > > a static and a nonstatic member function with the same name and the same
| > > parameter types (13.1).
| n'est pas clair,

au contraire, c'est clair comme l'eau de la fontaine.

| car les méthodes non statiques ont un paramètre (this)
| caché.
| On peut donc soit interpréter ce paragraphe comme :
| class A {static f() {}; f() {}; }; // est interdit

Interdit.

| ou
| class A {static f(A*) {}; f() {}; }; // est interdit

Autorisé. La contrainte dit : « ... and the same parameter types ».

-- Gaby
1 2 3