Kindklasse verdeckt Methoden der Basisklasse - isokonform?



  • Hiho,

    folgende Ausgangslage:

    struct Base
    {
        void foo() { cout << "Base" << endl;
    };
    
    struct Child : public Base
    {
        void foo(const string& text) { cout << text << endl; }
    };
    
    int main
    {
        Child obj;
        obj.foo(); //Fehler
    }
    

    Der Compiler findet das "foo" nicht. Das "foo" mit Parametern aus der Kindklasse überdeckt das aus der Basisklasse, obwohl die Parameterlisten doch unterschiedlich sind??? Ist das so ISO-Konform?

    MfG Pellaeon


  • Mod

    Pellaeon schrieb:

    Der Compiler findet das "foo" nicht. Das "foo" mit Parametern aus der Kindklasse überdeckt das aus der Basisklasse, obwohl die Parameterlisten doch unterschiedlich sind??? Ist das so ISO-Konform?

    Absolut. Im name lookup wird nach Namen gesucht, nicht nach Funktionssignaturen. Die Auflösung von Überladungen kann immer nur der zweite Schritt sein, nachdem die Funktionen bereits gefunden wurden. Und schließlich beschränkt sich Überdeckung nicht auf Funktionen. Zum Beispiel würde

    struct Child : public Base
    {
         enum { foo };
    };
    

    die Funktion foo aus Base ebenso überdecken.



  • Pellaeon schrieb:

    Hiho,
    Der Compiler findet das "foo" nicht. Das "foo" mit Parametern aus der Kindklasse überdeckt das aus der Basisklasse, obwohl die Parameterlisten doch unterschiedlich sind??? Ist das so ISO-Konform?

    Ja. Das ist so. Die Gültigkeitsbereiche ("scopes") werden immer von innen nach außen durchsucht. Das schießst auch Vererbungshierarchien ein. Sobald Funktionen im aktuellen Gültigkeitsbereich gefunden worden sind, wird die Suche abgebrochen. Dadurch können Namen in inneren scopes die von außeren verstecken. Du kannst den Effekt aber über eine using-Deklaration umgehen:

    struct Base
    {
        void foo() { cout << "Base" << endl;
    };
    
    struct Child : public Base
    {
        using Base::foo;
    
        void foo(const string& text) { cout << text << endl; }
    };
    

    Gruß,
    SP



  • Danke für die Antworten!


Anmelden zum Antworten