Methode der Basisklasse benutzen



  • Hallo,

    class A {
      addElement(type_1 x);
      addElement(type_2 x);
    }
    
    class B : A{
      addElement(type_3 x);
    }
    

    B b;
    type_1 x;

    b.addElement(x);

    Der Kompiler sagt: Konvertierung des Parameters 1 von type_1 in type_3 nicht möglich.

    Warum werden die Methoden der Basisklasse nicht benutzt?



  • class A {
    public:
      addElement(type_1 x);
      addElement(type_2 x);
    }
    
    class B : public A{ //public ist Standard, aber verdeutlicht besser, was du damit vorhast
      addElement(type_3 x);
    }
    


  • drakon schrieb:

    class B : public A{ //public ist Standard, aber verdeutlicht besser, was du damit vorhast
    

    Bei Klassen wird private gewählt wenn nichts angegeben ist.
    Standard 11.2 2



  • Jemand eine Idee zu meinem Problem public hilft auch nicht weiter.



  • Sisko86 schrieb:

    Jemand eine Idee zu meinem Problem public hilft auch nicht weiter.

    Auch wenn public zwingend ist:

    class A
    {
        public:
    
            void addElement(type_1 x);
            void addElement(type_2 x);
    }
    
    class B : public A
    {
        public:
            using A::addElement; // Ich weiß nicht ob es reicht
            void addElement(type_3 x);
    }
    

    Gleichnamige Methoden von Basisklassen können überdeckt werden. Die genaue Syntax, falls dies hier nicht stimmt muss aber ein anderer nachliefern, da ich dies selbst noch nicht gebraucht habe. Wo ich mir unsicher bin ist, ob ein using an der Stelle für die beiden Methoden der Basisklasse ausreicht, oder ob man dann noch mehr angeben muss...



  • Ja so lässt es sich kompilieren.
    Danke



  • Hallo!

    Überladene Funktionen müssen sich alle in einem Gültigkeitsbereich befinden, was bei den Funktionen der Basisklasse nicht der Fall ist.

    Du kannst entsprechende Funktionen in B hinzufügen, die nur die Basisklassenfunktionen aufrufen:

    class A {
      addElement(type_1 x);
      addElement(type_2 x);
    }
    
    class B : A{
      addElement(type_3 x);
      addElement(type_1 x) { A::addElement(x);}
      // ...
    }
    

    Oder mit der using-Direktive die Funktionen der Basisklasse zum Gültigkeitsberich hinzufügen:

    Basisklassenfunktionen aufrufen:

    class A {
      addElement(type_1 x);
      addElement(type_2 x);
    }
    
    class B : A{
      addElement(type_3 x);
      using A::addElement;
    }
    

    Gruß

    /edit/
    Ops, zu spät 🙂



  • Braunstein schrieb:

    drakon schrieb:

    class B : public A{ //public ist Standard, aber verdeutlicht besser, was du damit vorhast
    

    Bei Klassen wird private gewählt wenn nichts angegeben ist.
    Standard 11.2 2

    🙄
    Mist. Stimmt. Mein Fehler.



  • Hi,

    hmmm irgendwie vermisse ich einen Returntyp bei allen addElement()'s.
    Vielleicht bin ich kleinlich oder allen anderen ist klar, dass es sich um einen Copy&Paste-Fehler handelt oder ich verstehe da etwas grundlegend miß ...
    ... aber irgendwie brennt mir das in den Augen. 😉

    Gruß,

    Simon2.



  • Simon2 schrieb:

    Vielleicht bin ich kleinlich oder allen anderen ist klar, dass es sich um einen Copy&Paste-Fehler handelt oder ich verstehe da etwas grundlegend miß

    ... aber irgendwie brennt mir das in den Augen. 😉

    Schau mal mein Beispiel an, nicht nur dir hat etwas in den Augen gebrannt 😉

    Ich frage mich eh, welcher Compiler in der Standardkonfiguration einen fehlenden Rückgabewert ohne Warnung/Fehler durchgehen lassen würde.

    cu André


Anmelden zum Antworten