Methode in Kindklasse überschreiben



  • Hallo,

    ich habe folgendes Interface, dass alle Klasse implementieren sollen,
    die man in eine Datei speichern kann.

    class Storeable
    {
    public:
      virtual void saveBinary(FILE *stream) throw(MyException) = 0;
      virtual void loadBinary(FILE *stream) throw(MyException) = 0;
      virtual void saveBinary(const char* filename) throw(MyException)
      {
        FILE *fp = fopen(filename, "wb");
        if( fp == NULL )
          throw MyException(strerror(errno));
        this->saveBinary(fp);  
        fclose(fp);
      }  
      virtual void loadBinary(const char *filename) throw(MyException)
      {
          FILE *fp = fopen(filename, "rb");
          if( fp == NULL )
            throw MyException(strerror(errno));
          this->loadBinary(fp);  
          fclose(fp);
      }
    };
    

    Meine abgeleitete Klasse sieht so aus:

    class Child : public Storeable
    {
    public:
      ...
      virtual void saveBinary(FILE *stream) throw(MyException){...}
      virtual void loadBinary(FILE *stream) throw(MyException){...}
    };
    

    wenn ich nun in der main Child::saveBinary(const *char) aufrufe bekommen ich einen Fehler.

    void main(void){
      Child myChild;
      mychild.saveBinary("datei.bin");
    }
    

    error: no matching function for call to 'Child::saveBinary(const char*&)'

    woran kann das liegen? Es sollte doch die Methode der Elternklasse aufgerufen werden.

    Danke.



  • Du überdeckst die Methode in deiner Klasse Child. Du kannst eine Weiterleitung einrichten oder dem Compiler per "using xyz" mitteilen das du die Orginalmethode weiterhin anbieten willst.



  • Danke für die schnelle Antwort. Aber wo muss das "using ..." hin und wie ist die sytax? Ich finde nämlich dazu nur Informationen im Bezug auf namespaces.

    Die Weiterleitung hab ich nun so gemacht:

    class Child : public Storeable
    {
    public:
      ...
      virtual void saveBinary(FILE *stream) throw(MyException){...}
      virtual void loadBinary(FILE *stream) throw(MyException){...}
      virtual void saveBinary(const char* filename) throw(MyException){
        Storeable::saveBinary(filename);
      }
      virtual void loadBinary(const char *filename) throw(MyException){
        Storeable::loadBinary(filename);
      }
    };
    

    Ist da so richtig? Diesen Weg finde ich jedoch ein wenig umständlich, da ich mehrer Klassen habe, die so aussehen.



  • Ja so sieht die Weiterleitung aus. Per using funktioniert das folgendermasen:

    class Child : public Storeable
    {
    public:
      ...
      virtual void saveBinary(FILE *stream) throw(MyException){...}
      virtual void loadBinary(FILE *stream) throw(MyException){...}
    
      using Storable::loadBinary;
      using Storable::saveBinary;
    };
    

    Der Weg ist nur umständlich weil du versuchst Methoden zu überdecken. Du übschreibst die Methoden ja nicht sondern erzeugst neue Methoden mit ganz anderen Parametern aber gleichen Namen.


Anmelden zum Antworten