Vererbung



  • Hallo Leute 🙂 ,

    hoffentlich gehts euch gut bei der Hitze !

    Zuerst mal mein Code:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class cBasis
    {
    	private:
    
    		string itsA;
    		string itsB;
    
    	public:
    
    		cBasis(){}
    		cBasis(string a, string b)
    		{
    			itsA = a;
    			itsB = b;
    		}
    
    		~cBasis(){}
    
    	void zusammensetzen()
    	{
    		cout << itsA << itsB;
    	}
    
    };
    
    class cUnter:public cBasis
    {
    
    	private:
    
    		string itsA;
    		string itsB;
    
    	public:
    
     		cUnter(){}
    		cUnter(string a, string b)
    		{
    			itsA = a;
    			itsB = b;
    		}
    		~cUnter(){}
    };
    
    void main()
    {
    	cBasis basis("aaaaaaaaaaaaaa ","bbbbbbbbbbbbbb");
    	cUnter unter("cccccccccccccc ","dddddddddddddd");
    
    	 basis.zusammensetzen();
    	 cout << endl << endl << endl;
    	 unter.zusammensetzen();	
    }
    

    Hier mal meine Frage ich hab 2 einfache Klassen cBasis und die abgeleitete cUnter.
    Die in cBasis enthaltene Fnkt. zusammensetzen greift auf prif. Variablen der cBasis zu, nach der Vererbung hat doch cUnter ihre eigene Fnkt. zusammensetzen.
    Den Konstruktor von cBasis kann ich ja net mitvererben drum hab ich cUnter ihren eigenen implementiert.
    Auch die priv. Variablen.
    Führe ich den Code aus wird mir aber nur die zusammensetzen von cBasis ausgeführt.
    CUnter wird irgendwie übergangen.
    Wisst ihr wie ich das richtig mache 😕 ?!?!?!

    Danke schon mal vorab 😉

    ShadowEater 😉 😉 😉



  • zusammensetzen gehört ja auch zu cBasis. cUnter hat ja die Funktion nicht. Logischerweise werden die Strings der basisklasse ausgegeben.
    Du kannst doch aber den Konstruktor der Basisklasse in der Initialisierungsliste des Konstruktors der abgeleiteten Klasse aufrufen, und so die Variablen der Basisklasse initialisieren.

    cUnter(string a, string b) : cBasis (a,b), itsA(a), itsB(b) {}
    


  • Dann kannst du aber ItsA und ItsB auch gleich weglassen in der Unterklasse.



  • Wer weiß was er damit vor hat. 😉



  • Ok stimmt.
    Aber dann würd ich eher noch zusammensetzen() überladen. Denn jenachdem was er vorhat ist am Ende nicht mehr das selbe in Base und Unterklasse, sprich Zusammensetzen gibt nicht die gewünschten Member aus.



  • Danke Leute 🙂 ,

    jetzt funzt das 👍 !

    zusammensetzen gehört ja auch zu cBasis. cUnter hat ja die Funktion nicht.

    Ja klar daß zusammensetzen zu cBasis gehört ich hab nur gedacht wenn ichs vererb gehörts genausogut zu cUnter!

    Wenn ich also eine Fnkt. vererbe und diese Fnkt. in der Basisklasse auf priv. Variablen zugreift muss ich in der Initialisierungsliste der abgeleiteten Klasse immer den Konstruktor der Basisklasse aufrufen und damit die privaten Variablen der Basisklasse initialisieren damit ich in der abgeleiteten Klasse Zugriff habe 😕 ?

    Thx 😉
    ShadowEater



  • Nicht damit du Zugriff darauf hast (den hast du nämlich nicht), sondern nur um die Variablen der Basisklasse auch zu initialisieren.
    Wenn du uns sagst, was du eigentlich vorhast können wir dir bestimmt besser helfen.



  • Naja eigentlich will ich nur was über Vererbung lernen, hab au n Buch, das auch gar nicht so schlecht ist aber auch beim besten Buch bleiben eben manchmal noch Fragen offen.
    Hmmm das mit dem Zugriff den ich nicht hab is mir grad klar geworden.

    Stimmt ganz generell folgender Gedankengang :

    - In main instanziiere ich die beiden Obj. cBasis und cUnter
    - beiden Obj. übergebe ich die benötigten Werte
    - in den Klassen mache ich nur die Vorlagen meiner späteren Obj.

    bis hierhin ist mir alles soweit klar aber warum muss ich im Konstruktor der Unterklasse die Variablen der BasisKlasse initialisieren ich übergeb doch die Werte in main an die Objekte 😕

    🙂 ShadowEater



  • Dir ist vielleicht nicht aufgefallen, dass itsA und itsB in der Unterklasse eigentlich zweimal vorhanden sind. Einmal als private Elemente die du von der Basisklasse geerbt hast, auf die du somit in cUnter keinen Zugriff hast und die in zusammensetzen() ausgegeben werden. cUnter deklariert diese Variablen unter gleichen Namen noch einmal und diese initialisierst du im Konstruktor von cUnter. Hier mal dein Beispiel leicht abgeändert um das zu demonstrieren.

    class cBasis
    {
        protected: // protected, damit ich in cUnter Zugriff habe
            string itsA;
            string itsB;
        public:
            cBasis(){}
            cBasis(string a, string b)
           {
                itsA = a;
                itsB = b;
            }
            ~cBasis(){}
        void zusammensetzen()
        {
            cout << itsA << itsB;
        }
    };
    
    class cUnter:public cBasis
    {
        private:
            string itsA;
            string itsB;
        public:
            cUnter(){}
            cUnter(string a, string b)
            {
    // hier werden itsA und itsB von cUnter initialisiert
                itsA = a;
                itsB = b;
    // hier werden itsA und itsB von cBasis initialisiert
                cBasis::itsA = a;
                cBasis::itsB = b;
            }
            ~cUnter(){}
    };
    

    Den gleichen Effekt erreichst du beim Aufruf des Basisklassenkonstruktors im Konstruktor von cUnter.



  • Oh Mann vielen Dank Braunstein, ich meld mich morgen nochmal!
    Vielleicht können wir ja mal chatten oder so 😋

    Bye
    ShadowEater


Anmelden zum Antworten