protected



  • Verstehe ich es richtig, dass Attribute und Methoden, die als protected deklariert sind, gar nicht von der eigenen Klasse, sondern nur von abgeleiteten Klassen verwendet werden können?


  • Mod

    Nein. Die eigene Klassen kann natürlich alles benutzen. Das wichtige an protected ist, dass auch abgeleitete Klassen dran dürfen, aber - im Gegensatz zu public - sonst niemand.



  • verstehe. Wenn ich eine Klasse habe und möchte, dass sie über einen Standardkonstruktor verfügt, dann mus sich doch einach keinen erstellen, oder? Nur wenn ich keinen Konstruktor erstelle, hat die Klasse einen Standardkonstruktor, richtig?



  • protected87 schrieb:

    verstehe. Wenn ich eine Klasse habe und möchte, dass sie über einen Standardkonstruktor verfügt, dann mus sich doch einach keinen erstellen, oder? Nur wenn ich keinen Konstruktor erstelle, hat die Klasse einen Standardkonstruktor, richtig?

    Wenn du garkeinen Konstruktor deklarierst, dann generiert der Compiler dir automatisch einen Default-Ctor und einen Copy-Ctor. Wenn du den Copy-Ctor deklarierst, generiert er dir keinen weiteren Ctor. Wenn du irgendeinen anderen Ctor deklarierst, dann wird der Copy-Ctor generiert, nicht aber der default-Ctor.



  • danke. wenn ich jetzt eine klasse erstellen, von der geerbt wird, dann sieht das so aus:

    class Basis 
    {
    public:	
    	string get_str(void){return str;}
    	string type(void) {return "Ich bin die Basis";}
    	Basis(string s);
    private:
    	string str;
    protected:
    	string sec;
    
    };
    
    Basis::Basis(string s)
    {
    	str = s;
    	sec = "geheim";
    }
    
    class Child : public Basis
    {
    public:
    	Child(string s);
    	string type(void) {return "Ich bin das Kind";}
    };
    
    Child::Child(string s) : Basis(s)
    {
    }
    
    int main()
    {
    	Basis* b = new Basis("Basis");
    	Child* c = new Child("Kind");
    
    	cout << c->get_str();
    	return 0;
    }
    

    Was passiert beim Aufruf Child* c = new Child("Kind");? Wir die Variable "str" von Basis mit "Kind" gefüllt oder die unsichtbar geerbte Variable "str" von Child mit "Kind" gefüllt?

    Danke



  • und wenn ich Child private von Basis erben lasse, wird dann einfach alles private also auch die publich Attribute oder was hat das zur Folge?



  • protected87 schrieb:

    und wenn ich Child private von Basis erben lasse, wird dann einfach alles private also auch die publich Attribute oder was hat das zur Folge?

    Wieso probierst Du es nicht einfach mal selbst aus?



  • pumuckl schrieb:

    protected87 schrieb:

    verstehe. Wenn ich eine Klasse habe und möchte, dass sie über einen Standardkonstruktor verfügt, dann mus sich doch einach keinen erstellen, oder? Nur wenn ich keinen Konstruktor erstelle, hat die Klasse einen Standardkonstruktor, richtig?

    Wenn du garkeinen Konstruktor deklarierst, dann generiert der Compiler dir automatisch einen Default-Ctor und einen Copy-Ctor. Wenn du den Copy-Ctor deklarierst, generiert er dir keinen weiteren Ctor. Wenn du irgendeinen anderen Ctor deklarierst, dann wird der Copy-Ctor generiert, nicht aber der default-Ctor.

    Einen Destruktor und einen Zuweisungsoperator erstellt er doch auch!? Wobei er sie auch nur erstellt wenn sie benötigt werden, was natürlich sehr schnell vorkommt.

    @TE:
    Wenn deine Klasse Datenelemente von integrierten Typen enthält, solltest du allerdings immer deinen eigenen Standardkonstruktor deklarieren und definieren, denn sonst werden je nach Kontext, die Datenelemente( von integrierten Typen ) nicht initialisiert.

    Lg freeG



  • Vielleicht sollte noch erwähnt werden, dass man mit protected nur Zugriff auf die die protected Methoden/Variablen des this Objekts hat. Auf andere Instanzen kann man nämlich nicht zugreifen.



  • 314159265358979 schrieb:

    Vielleicht sollte noch erwähnt werden, dass man mit protected nur Zugriff auf die die protected Methoden/Variablen des this Objekts hat. Auf andere Instanzen kann man nämlich nicht zugreifen.

    Doch, dass kann man schon:

    class A
    {
    protected:
        int a;
    public:
        void assign(A const & other)
        { 
            a = other.a; //other ist andere Instanz
        }
    };
    
    int main()
    {
        A a1;
        A a2;
    
        a1.assign(a2);
    }
    


  • Seltsam. Ich kann mich da an einen Fall erinnern, in dem das nicht ging. Auf Nachfrage hat man mir gesagt, dass das nicht geht. Jetzt bin ich verwirrt.



  • 314159265358979 schrieb:

    Seltsam. Ich kann mich da an einen Fall erinnern, in dem das nicht ging. Auf Nachfrage hat man mir gesagt, dass das nicht geht. Jetzt bin ich verwirrt.

    Das wäre schlecht, wenn das nicht ginge, weil man dann nur schwerlich Assignment-Operatoren schreiben könnte.



  • protected87 schrieb:

    Was passiert beim Aufruf Child* c = new Child("Kind");? Wir die Variable "str" von Basis mit "Kind" gefüllt oder die unsichtbar geerbte Variable "str" von Child mit "Kind" gefüllt?

    Es gibt nur eine Variable str in deinem Objekt - die von Basis geerbte.


Log in to reply