Tenir compte:La substitution d'une méthode virtuelle non constante cache-t-elle une surcharge const?
#include <iostream>
using namespace std;
struct A {
virtual void f() { cout << "A::f" << endl; }
virtual void f() const { cout << "A::f const" << endl; }
};
struct B : public A {};
struct C : public A {
virtual void f() { cout << "C::f" << endl; }
};
int main()
{
const B b;
b.f(); // prints "A::f const"
const C c;
c.f();
// Compile-time error: passing ‘const C’ as ‘this’ argument of
// ‘virtual void C::f()’ discards qualifiers
}
(. J'utilise GCC)
Il semble donc que la version const de f() qui est caché en C. Cela me semble beaucoup de sens, mais est il mandaté par la norme?
"Virtuel" est un hareng rouge. Nous n'appelons aucun 'f' virtuellement (via un pointeur ou une référence de classe de base) ici. Toutes les recherches de 'f' trouvent le' f' le plus dérivé. – MSalters
Virtual et const ne s'appliquent pas vraiment à la question, mais je les ai laissés comme tags car je ne vois pas beaucoup de mal et je n'ai pas besoin d'inclure un tag plus pertinent. –
Je suis d'accord sur 'virtual', mais' const' est la raison d'être de toute cette question. Remplacer 'f()' cache 'f() const'. – Ari