den folgenden Codeprivate virtuelle Funktion der Basis von privaten virtuellen Funktion abgeleitet
class A
{
public:
void g(int x)
{
f(x);
}
protected:
virtual void f(int) = 0;
};
class B: public A
{
protected:
virtual void f(float) = 0;
private:
void f(int x) override final
{
f(float(x));
}
};
class C: public B
{
private:
void f(float) override final {}
};
int
main()
{
C c;
c.g(1);
return 0;
}
zusammengestellt mit g++ -Woverloaded-virtual
versteckt wird, erzeugt die Warnung:
x.cc:19:7: warning: ‘virtual void B::f(int)’ was hidden [-Woverloaded-virtual]
void f(int x) override final
^
x.cc:28:7: warning: by ‘virtual void C::f(float)’ [-Woverloaded-virtual]
void f(float) override final {}
^
Ich verstehe nicht, was hier versteckt wird. Aus dem Gültigkeitsbereich C
gibt es nur eine mögliche Überlast auf f
, da B::f(int)
innerhalb C
privat ist.
Aus dem Bereich B
gibt es zwei, aber beide sind explizit innerhalb B
benannt.
Aber was ist der Sinn dieser Warnung? Es warnt mich vor etwas, das in der Tat nicht auf meine Situation zutrifft. Wie kann ich es loswerden (anders als '#pragma diagnostics' Schalter)? – TFM
@TFM, 'C * c = neues C; c-> f (int {}); 'hier wird f (float) zum Versenden ausgewählt. aber hier 'B * b = c; b -> f (int {}) 'f bedeutet f (int). Zum Beispiel, wenn Sie folgende Hierarchie haben: struct A {virtual void f (int), f (float); }; Struktur B: A {void f (float);}; struct C: B {void f (int), f (float);}; 'dann kannst du über Bs iface nur f (float) senden, außer du legst den Namen von f explizit mit A 's fest (b_iface-> A :: f (int {})). –
@GreenTree Ich verstehe, was diese Warnung in einer Situation bedeutet, in der es tatsächlich Sinn macht. Ich versuche seine Auswirkungen in meiner Situation zu verstehen. – TFM