Konstruktor und Vererbung



  • Hallo, warum bekomme ich bei

    cout<<ret<<endl;
    

    eine 1 ausgeben?
    Ich initialisieren doch die Variable int sp; aus der Klasse car mit meinem Konstruktor.

    Wenn ich die Funktion

    void SetSp();
    

    aufrufe dann wird im Hauptprogramm der Wert ausgeben mit dem ich auch int sp; aus der car Klasse initialisiert habe.

    Wieso funktioniert das mit meinem Konstruktor nicht?

    #include <iostream>
    using namespace std;
    
    class car
    {
      public:
            int sp;
    
            car() {}
    
            car ( int s ) :
            sp(s) {}
    
    };
    
    class info : car
    {
            public:
    
            // info() {} <- Falsch denn: Die Klassen von der geerbt wird braucht einen Standartkonstruktor
    
            int GetSp();
            void SetSp();
    
    };
    
    void info :: SetSp()
    {
            sp = 200;
    }
    
    int info :: GetSp()
    {
            return sp;
    }
    
    int main(int argc, char* argv[])
    {
    int ret;
    
    car c ( 300 );  // Variable int sp; aus der car Klasse mit 300 initialisieren
    info inf;
    
            // inf.SetSp();
    
            ret = inf.GetSp();
            cout<<ret<<endl; // Gibt 1 aus
    
    return 0;
    }
    


  • Du initialisierst nicht die Variable sp aus der Klasse car, sondern die Variable sp in dem Objekt c (vom Typ car) mit 300. Das Objekt inf (vom Typ info) hat mit dem Objekt c nicht das geringste zu tun.



  • Also kann ich gar nicht einfach so mit:

    void info :: GetSp(); auf die Variable int sp; aus der Klasse zugreifen.
    Da die Variable int sp; ja im Objekt c (vom Typ car) initialisiert wird.

    Kann man das so sagen.
    Das ist gar nicht so einfach mit dem ganzen begriffen. 😞

    Ich habs nochmal etwas überarbeitet passt das jetzt so von den Begriffen?

    #include <iostream>
    using namespace std;
    
    class car
    {
      public:
            int sp;
    
            car() {}
    
            car ( int s ) :
            sp(s) {}
    
    };
    
    class info : car
    {
            public:
    
            int GetSp();
            void SetSp();
    
    };
    
    void info :: SetSp()
    {
            sp = 200;  // Initialisiert die Variable sp aus der Klasse car mit dem Wert 200 Oder initialisiert ich hier sp mit dem Typ info der auf car zeigt?
    //Ich weiss nicht wie ich das in Worten ausdrücken soll
    }
    
    int info :: GetSp()
    {
            return sp; // Gibt den Wert der Variable sp aus der Klasse car zurück
    }
    
    int main(int argc, char* argv[])
    {
    int ret;
    info inf;
    
    car c ( 300 );  // Initialisiert die Variable sp im Objekt c (vom Typ car)
    cout<<c.sp << endl; // Gibt die Variable sp aus dem Objekt c (vom Typ car aus)
    
    inf.SetSp();
    
    ret = inf.GetSp();
    cout<<ret<<endl;
    
    system("PAUSE");
    }
    


  • #include <iostream>
    
    class car
    {
        int sp;
    
    public:
    
        car() {}
        car ( int s ) : sp(s) {}
    
        int GetSp() {return sp;}
    };
    
    //class info : car   Hier wird automatisch private vererbt, du willst aber public (auch wenn du's nicht weißt ;) )
    class info : public car
    {
    public:
    
        info() {}
        info(int s) : car(s) {}
    };
    
    int main()
    {
        car c ( 300 );
    
        std::cout << c.GetSp() << '\n';
    
        info inf( 300 );
    
        std::cout << inf.GetSp() << '\n';
    
        for(std::cout << "Bitte schließen...\n";;);
    }
    


  • ctor schrieb:

    Ich habs nochmal etwas überarbeitet passt das jetzt so von den Begriffen?

    Nein. Klassen haben keine Variablen. Die Objekte haben (member-)Variablen.

    Du willst sp in car nicht public machen, das bricht die Kapselung auf.

    GetSP und SetSP gehören zu car, nicht zu info. Getter/Setter gehören zuersteinmal immer dort hin, wo auch das Member sitzt, zu dem sie gehören.

    Lies dir im Einsteigerbuch deiner Wahl mal die Kapitel zur Objektorientierung durch. Dann werden die Konzepte klarer und du tust dich auch mit den Begriffen nicht so schwer.


Anmelden zum Antworten