Methodenüberladung in Klassenhierarchien?



  • Mir ist nicht so ganz klar, wieso folgender Code eine Fehlermeldung erzeugt:

    struct A
    {
          void f() {}
    };
    
    struct B: public A
    {
          void f(int) {}
    };
    
    int main()
    {
       B().f(); // Fehler
    }
    
    error: no matching function for call to 'B::f()'
    

    Erwarten würde ich, dass f() aus der Oberklasse aufgerufen wird.
    Was ist der Grund, dass dem nicht so ist? Wird die Methode f() in einer ausgefallenen Art und Weise von f(int) überdeckt?

    Danke für Antworten.


  • Mod

    mortified_penguin schrieb:

    Wird die Methode f() in einer ausgefallenen Art und Weise von f(int) überdeckt?

    Genau das. Eine Methode mit dem gleichen Namen verdeckt eventuelle geerbte Methoden. Mit using kannst du sie aber wieder sichtbar machen:

    struct B: public A
    {
          using A::f;
          void f(int) {}
    };
    


  • Das Problem ist, dass f(int) die geerbte Methode f() überdeckt. f(int) und f() sind ein einem unterschiedlichen Scope. C++ get Scope für Scope durch bis ein passender Name gefunden wird. In deinem Fall fängt er im Scope von B an und findet dort den Namen f. Die einzige Methode mit dem Namen f in diesem Scope ist aber f(), d.h. die Version ohne int Parameter.

    Eine mögliche Lösung ist

    using A::f;
    

    in B zu schreiben.


Anmelden zum Antworten