protected??



  • Hallo kann mir bitte einer ganz kurz und knapp erklärenwas protected ist? Bitte keine links angeben, hab schon dadrüber gelesen, aber nicht kapiert 😞



  • protected ist vor allem für die Vererbung erfunden worden.

    Falls du zum Beispiel folgende Basisklasse hast:

    class Base
    {
    private:
        int zahl1;
    protected:
        string zeichenkette;
    public:
        virtual void func()
        {
            zahl1++;
            zeichenkette = "hallo! ;)";
        }
    };
    

    und folgende Kindklasse:

    class Child : public Base
    {
    public:
        void func() //Überschreiben von func aus der Basisklasse
        {
            zahl++;
            zeichenkette = "wieder hallo!";
        }
    };
    

    Bei dieser Kindklasse wird der Compiler bei der Zeile "zahl++;" meckern, da durch die Vererbung nicht mehr auf die private-Elemente der Vaterklasse zugegriffen werden kann. Der Zugriff auf zeichenkette funktioniert allerdings einwandfrei, da zeichenkette in der Kindklasse private ist.

    Das ganze hat den Vorteil, dass man Elemente, die man nur für Funktionen der Basisklasse verwendet, vor der Kindklasse verstecken kann, indem man sie als private deklariert.

    Merke:

    Vaterklasse -> Kindklasse (bei "öffentlicher"(public) Vererbung)
    private -> unsichtbar
    protected -> private
    public -> public
    


  • hi,

    Auf Member einer Klasse (seien es Variablen, oder Methoden), die protected sind, können auch abgeleitete Klassen (Objekte) zugreifen.
    Während z.B. auf private-Member nur klasseneigene Member zugreifen können. :xmas2:



  • cin schrieb:

    Merke:

    Vaterklasse -> Kindklasse (bei "öffentlicher"(public) Vererbung)
    private -> unsichtbar
    protected -> private
    public -> public
    

    Nicht ganz: protected Mitglieder des Vaters werden auch im Kind als protected eingestuft.



  • Gut, werds glei mal meinem ehemaligen Lehrer erzählen 😉



  • @cin: Die "protected-Elemente" einer Vaterklasse sind in der Kind-Klasse private, wenn die Kind-Klasse von der Vater-Klasse private erbt. 😉

    Gruß Caipi



  • darf ich auch kurz einklinken? ich nehme das eben auch grad durch. protected wie bereits erwähnt, ist bei vererbung von nutze. jede abgeleitete klasse hat somit auch zugriff auf die protected elementvariablen/methoden, richtig? andernfalls nur auf die public elemente wenn der zugriff über objekte geht.

    und noch eins dazu:
    wird in einer basisklasse, von der abgeleitet wird, eine abgeleitete klasse als friend deklariert, hat sie vollen zugriff auf die basis klasse, also auch auf den protected bereich, richtig? z.b.

    class Animal
    {
    	friend class Cat;
    
    	public:
            Animal();
        	void Walk();
    
        private:
        	const char *hiden;
    };
    
    class Cat : public Animal
    {
    	public:
        	void Eat();
            void Secure(Animal animal)
            {
            	ShowMessage(animal.hiden);
            }
    
        private:
        	char *name;
    };
    
    Animal::Animal()
    {
    	hiden = "Platt!";
    }
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    	Cat cat;
        Animal animal;
        cat.Secure(animal);
    }
    


  • kleiner schreibfehler. das:

    also auch auf den protected bereich, richtig?

    sollte heissen:

    also auch auf den private, public sowie protected bereich, richtig?



  • Seppy schrieb:

    wird in einer basisklasse, von der abgeleitet wird, eine abgeleitete klasse als friend deklariert, hat sie vollen zugriff auf die basis klasse, also auch auf den protected bereich, richtig? z.b.

    Ja. Freundschaft ist die staerkste Bindung. Da ist dann alles erlaubt. idR vermeidet man Freunde aber (eben wegen dieser starken Bindung) und setzt sie nur ein wo es noetig ist (im zweifelsfall 2mal darueber nachdenken) und in diesem Beispiel schreit es nach einem Designfehler (da Base Derived nie kennen muss). Nichtdestotrotz ist die Aussage richtig.

    Kurze Anmerkung noch: private, protected und public sind Stufen. Wenn man auf private zugreifen kann, kann man auch immer auf public und protected zugreifen. Wenn man auf protected zugreifen kann, kann man auch immer auf public zugreifen.


Anmelden zum Antworten