"conflicts with base class" error



  • Hallo,

    ich habe eine von einer anderen Klasse (wxTextCtrl) abgeleitete Klasse (wxNumCtrl).

    in der Basisklasse gibt es eine Funktion

    wxString GetValue();
    

    die ich in meiner abgeleiteten Klasse mit der Funktion

    int GetValue();
    

    überschreiben möchte.

    Soweit die Idee.

    Nun das Problem:
    wxNumCtrl::GetValue() überschreibt wxTextCtrl::GetValue() nicht. Ich bekomme einen "wxNumCtrl::GetValue() conflicts with base class wxTextCtrl::GetValue()" error beim compilieren.

    Was mache ich falsch?

    Gruß,
    Sebastian



  • Wenn man was ueberschreibt, sollte auch der Rueckgabewert gleich sein ....
    sonst ist es nich "ueberschrieben"

    also hasst du quasi parralel
    wxString GetValue(); (aus der basisklasse)
    int GetValue();
    in deiner klasse.
    da aber funktionen gleicher signatur (Rueckgabewert gehoert nich zur signatur, sondern nur name, parameter und const qualifer ) nicht doppelt definiert werden duerfen, motzt das hier dein compiler direkt an ....

    also merke:
    ueberschreiben geht nur, wenn signatur und rueckgabewert identisch sind,
    funktionen an einer klasse duerfen keine gleichen signaturen haben, erst auch nicht mit 2 unterschiedlichen rueckgabeparametern ....

    Ciao ...



  • Was mache ich falsch?

    Du redefinierst den Rückgabewert einer geerbten Methode, das ist nicht gut. Benenn deine Methode um oder mach sonst was, aber das ist schlechter Stil.



  • Sagt dir der Begriff "Polymorphie" etwas? Du kannst eine Methode nicht anhand des Rückgabetyps überladen - und um die Kompatibilität zur Basisklasse zu erhalten, muß der Rückgabetyp in der abgeleiteten Methode von der Basismethode abgeleitet sein. Oder stell dir mal vor, was da rauskommen sollte:

    class Base
    {
    public:
      virtual std::string getVal() {return "Alpha";}
    };
    
    class Derived:public Base
    {
    public:
      int getVal() {return 1;}
    };
    
    int main()
    {
      Base* var = new Derived;
      cout<<var->getVal();
    }
    

    Die Typprüfung wird anhand des statischen Typs durchgeführt, verwendet also istream::operator<<(string), wenn dort ein int zurückkommt, gibt es einen mittelschweren Kollaps.



  • Ok, danke. Scheint so nicht zu funktionieren. Dann halt GetInt().

    Danke.
    Sebastian



  • CStoll schrieb:

    Sagt dir der Begriff "Polymorphie" etwas? Du kannst eine Methode nicht anhand des Rückgabetyps überladen - und um die Kompatibilität zur Basisklasse zu erhalten, muß der Rückgabetyp in der abgeleiteten Methode von der Basismethode abgeleitet sein.

    überladen? stimmt zwar, aber du meintest wohl überschreiben. wenn getVal in der basisklasse nicht virtual wäre hätte er nämlich kein problem.



  • nanunu schrieb:

    CStoll schrieb:

    Sagt dir der Begriff "Polymorphie" etwas? Du kannst eine Methode nicht anhand des Rückgabetyps überladen - und um die Kompatibilität zur Basisklasse zu erhalten, muß der Rückgabetyp in der abgeleiteten Methode von der Basismethode abgeleitet sein.

    überladen? stimmt zwar, aber du meintest wohl überschreiben. wenn getVal in der basisklasse nicht virtual wäre hätte er nämlich kein problem.

    Oh doch, das hätte er.



  • ja, nach meyers regel 37 schon (Never redefine an inherited nonvirtual function)... aber kompilierbar und eindeutig wäre der code trotzdem.


Anmelden zum Antworten