Konstruktor einer Subclass



  • Hi,
    ich spiele derzeit etwas mit Vererbung rum und meine hier laut Literatur alles richtig gemacht zu haben.
    Eine Unterklasse soll zwei Attribute von der Basisklasse erben.
    Laut Fehlermeldung soll ich im Konstruktor der Unterklasse die Basisklasse initialisieren.
    Mir ist nicht klar, was genau ich jetzt hier machen soll.
    Meiner Meinung nach müsste das so funktionieren und ich habe auch Programme gesehen,
    in denen das so gemacht wird, muss aber dazu sagen, dass ich mich noch kaum
    mit Vererbung beschäftigt habe.

    #include <iostream>
    
    using namespace std;
    
    class test      //Baseclass
    {
        protected:
            float a;
            float b;
    
        public:
            test(float, float);
            void ausgeben();
    };
    
    test::test(float x, float y):a(x),b(y)
    {
    }
    
    void test::ausgeben()
    {
        cout<<a<<","<<b;
        cout<<endl;
    }
    
    //------------------------
    
    class erbe: public test     //Subclass
    {
        private:
            int var;
    
        public:
            erbe(float, float, int);
    };
    
    erbe::erbe(float x1, float x2, int x3)  //Fehlermeldung: constructor for 'erbe' must
    {                                       //explicitly initialize the base class 'test'
                                            //which does not have a default constructor.
                                            //Was soll ich hier machen?
    }
    
    
    
    
    int main()
    {
    
    
        return 0;
    }
    


  • Wie lernst du? Das sollte doch wohl im Kapitel Vererbung erklärt werden.

    erbe::erbe(float x1, float x2, int x3) : test(x1,x2)



  • @theAnfänger77 sagte in Konstruktor einer Subclass:

    which does not have a default constructor

    Oder einen Default constructor schreiben.



  • Vielen Dank für die Antworten!
    Das geht jetzt:

    #include <iostream>
    
    using namespace std;
    
    class test      //Baseclass
    {
        protected:
            float a;
            float b;
    
        public:
            test(float, float);
            void ausgeben();
    };
    
    test::test(float x, float y):a(x),b(y)
    {
    }
    
    void test::ausgeben()
    {
        cout<<a<<","<<b;
        cout<<endl;
    }
    
    //------------------------
    
    class erbe: public test     //Subclass
    {
        private:
            int var;
    
        public:
            erbe(float, float, int);
            void ausgeben();
    };
    
    erbe::erbe(float x1, float x2, int x3):test(x1,x2)
    {
        var = x3;
        ausgeben();
    }
    
    void erbe::ausgeben()
    {
        cout<<a<<","<<b<<","<<var;
        cout<<endl;
    
    }
    
    
    int main()
    {
        erbe E1(1.1,2.2,3);
        E1.ausgeben();
    
    
        return 0;
    }
    

    Mit dem Default Constructor habe ich mich noch nicht beschäftigt.
    Das werde ich allerdings als nächstes tun.
    Wie würde sowas denn dan aussehen?
    (Nur falls jemand für die Vollständigkeit hier die Lösung mal zeigen möchte)



  • @theAnfänger77 sagte in Konstruktor einer Subclass:

    Wie würde sowas denn dan aussehen?

    Genauso, nur ohne Parameter?

    public:
            test();
    ...
    erbe::erbe(float x1, float x2, int x3):test()
    // Macht nur wenig sinn, da du x1/x2 ja setzen willst.
    


  • Vielen Dank🙂



  • Der Compiler weist aber nicht aus Spaß auf den Default-Konstruktor hin. Der Sinn der Sache ist, dass man in dem Fall die Initialisierung mit test() in der Initialisiererliste weglassen kann.


Log in to reply