Problem bei Aufruf einer geerbten Funktion



  • Hallo Leute,

    ich habe eine Klasse die einen Pointer auf ein Element einer anderen Klasse hat:

    class Foo {
        Bar* bar;
        ...
    }
    

    jetzt will ich in Klasse Foo eine Funktion aufrufen, die eine geerbte Funktion von Bar aufruft:

    Foo::get_text(){
        this->bar->get_text();
    }
    

    Klasse Bar:

    class Bar : protected Text {
        ...
    }
    
    class Text {
        get_text();
        std::string text;
    }
    

    Beim Aufruf der Funktion get_text() von Foo aus bekomme ich folgenden Fehler:

    error: request for member 'get_text' is ambiguous
    

    (Codeblocks, gcc)

    Würde gerne wissen, was falsch ist ...

    Gruß Simon



  • hi,
    vermutlich hast du kein gültiges objekt. Bar* bar; ist nur eine Deklaration, kein gültiges Objekt.
    Machmal Bar bar; und dann this->bar.get_text();
    oder bar = new Bar...

    mfg



  • Danke für die schnelle Antwort,

    leider funktioniert das auch nicht, ich bekomme den selben Fehler

    das Problem ist auch, dass ich nur einen Pointer auf das Objekt haben will

    Gruß Simon



  • Du wirst irgendwo noch ein Foo::get_text(/*...*/) haben.

    Beispiel:

    Foo::get_text();
    Foo::get_text(int a = 42);
    
    Foo f;
    f.get_text(); //welches?
    

    Wenn der Aufruf von Bar::get_text() der mehrdeutige Aufruf sein sollte (es geht aus dem Fehler nicht hervor, ob es Foo::get_text() oder Bar::get_text() ist), dann gilt das oben gesagte analog für Bar .



  • Hallo,

    ja, ich hab mehrere Funktionen mit dem Namen, aber alle haben eine unterschiedliche Parameteranzahl und keine Defaultwerte.

    ich bekomme noch:

    candidates are: virtual void Text::get_text()
                    virtual void Text::get_text(int)
    

    ps. In Klasse Text natürlich:

    virtual void get_text();
    

    Also ich weis jetz nicht an was es noch liegen könnte, hat jemand vielleicht noch einen Ansatzpunkt?

    EDIT: er zeigt auf die Funktion Bar::get_text() /EDIT

    Gruß Simon



  • varginator schrieb:

    candidates are: virtual void Text::get_text()
                    virtual void Text::get_text(int)
    

    Dann ist doch eigentlich klar, dass Text zwei get_text -Funktionen ( () und (int) )deklariert, zwischen denen er nicht unterscheiden kann. Bist Du sicher, dass Du keine Default-Parameter für die int -Variante vorgibst?
    Vielleicht solltest Du mal Deine Klasse Text richtig zeigen. Von virtual sieht man in dem Beispiel oben nämlich nichts.



  • Hallo,

    Mein Code ist ziemlich lang, deshalb wollte ich hier mal ein Beispiel posten,
    bei welchem Teil die Probleme auftauchen, aber da ich zu wenig über mein Problem sagen kann, hier mal der relevante Teil aus meinem richtigen Code (gekürzt):

    size.h

    class SIZE {
        protected:
            int w, h;
    
        public:
            SIZE();
            SIZE(int w, int h);
            virtual ~SIZE();
    
        public:
            virtual int get_w();  //benutze ich um w zu bekommen
            virtual int get_h();  // " h "
            virtual int get_w(int &w);
            virtual int get_h(int &h);
    };
    

    tile.h

    class TILE : protected SIZE {
        public:
            TILE();
            TILE(int w, int h);
            ~TILE();
    };
    

    object.h

    class OBJECT {
        protected:
            TILE* tile;
    
        public:
            OBJECT();
            OBJECT(int w, int h);
            ~OBJECT();
    
        public:
            int get_w();
            int get_h();
            int get_w(int &w);
            int get_h(int &h);
    };
    

    object.cpp

    ...
    int OBJECT::get_w(){
        return this->tile->get_w();  //Hier bekomme ich den Fehler
    }
    
    int OBJECT::get_w(int &w){
        w = this->tile->get_w();
    }
    ...
    

    Der Fehler wird schon beim Kompilieren angezeigt

    error: request for member 'get_w' is ambiguous
    error: candidates are: virtual int SIZE::get_w()
                           virtual int SIZE::get_w(int)
    

    Hoffe, dass ich alles wichtige dabei habe ...

    Gruß Simon



  • Hmm, so wie Du es gepostet hast, müsste es eigentlich compilieren...



  • Hallo,

    ja, so müsste es 'eigentlich' funktionieren ...

    Ich habe ...
    ... keine Default-Parameter
    ... die Vererbung hoffentlich richtig
    ... es auch schon ohne Pointer ohne Erfolg versucht
    ... keine Ahnung warum es nicht geht

    Nochmals danke für die Hilfe und die Antworten (besonders Tachyon), ich werde mir den Code morgen nochmal in ruhe ansehen, evtl. hab ich an andrer Stelle n kleinen Fehler ...

    ... schönen Abend noch ...

    Gruß Simon



  • class TILE : protected SIZE

    dann sind ja die get_xxx funktionen in title protected. die kannst du also von object aus garnicht erreichen...


Anmelden zum Antworten