2017-11-23 5 views
1

Wenn ich ein Mitglied geschützt in Basisklasse deklarieren und als privat in abgeleiteten Klasse, den Zugriff auf das Element erben ist nicht erlaubtZugang Erklärung eines geschützten Mitglied der Basisklasse als öffentlich in abgeleiteten Klasse C++

class base{ 
protected: 
int a; 
}; 
class derived : public base 
{ 
protected: 
int b; 
public: 
derived():base(){ a=0; b=0;} 
void show(){cout<<"a= "<<a<<"\tb= "<<b;} 
}; 
int main() 
{ 
derived d; 
d.a=10; //error: 'int base::a' is protected within this context 
d.show(); 
} 

Aber wenn ich die abgeleitete Klasse schreiben, kann ich Wert den Zugang der Öffentlichkeit für ‚a‘ (geschützt in Basis)

class derived : public base 
{ 
protected: 
int b; 
public: 
base::a; 
}; 

int main() 
{ 
derived d; 
d.a=20; // no error 
} 

Nun gewähren von ‚a‘ in main() ohne Fehler ändern.

Ich lese in C++ vollständige Nachschlagewerk, Zugriff gewähren wird Zugriffsrechte wiederherstellen, aber man kann nicht erhöhen oder senken den Zugriffsstatus.

Kann mir jemand sagen, warum ich auf geschützte Mitglieder der Basisklasse zugreifen kann, privat geerbt und später öffentlichen Zugriff wie eine öffentliche Variable der abgeleiteten Klasse gegeben (verletzt es nicht die Kapselung, dh Geschütztes Mitglied sollte wiederhergestellt werden wie geschützt). Bitte leitet mich, wenn mein Verständnis

+0

Geschützte Variablen, auf die nur innerhalb der abgeleiteten Klasse zugegriffen werden kann. Geschützte Variable ist keine öffentliche Variable, die als 'd.a = 20;' verwendet werden kann. –

+0

protected gibt das Mitglied an seine abgeleitete Klasse, aber es gibt es nicht für die Öffentlichkeit (außerhalb der Nutzung), wenn Sie das geschützte Mitglied veröffentlichen, ist es dann auch für andere öffentlich zugänglich. – nullqube

Antwort

1

protected lebt nicht bis zu seinem Namen. Es schützt einfach nicht viel; Es ist nicht sehr weit von public.

Der Moment base sagt, dass a ist protected, das Schicksal des Feldes ist versiegelt - es ist jetzt praktisch für den Rest der Welt offen. Alles, was Sie tun müssen, ist eine abgeleitete Klasse zu erstellen, Zugriff auf die Elementvariable und Expose ist für die Außenwelt - das ist, was Sie mit derived getan haben, wenn Sie base::a geschrieben haben (übrigens fügen Sie normalerweise vorher using hinzu).

Sie könnten auch mit einer normalen Funktion tun, nachdem alle:

class base { 
protected: 
    int a; 
}; 

class derived : public base 
{ 
protected: 
    int b; 
public: 
    int& GotYou() 
    { 
     return a; 
    } 
}; 


int main() 
{ 
    derived d; 
    d.GotYou() = 20; // no error 
} 

Wenn Sie Schutz möchten, private verwenden.

By the way, die folgende Zeile gibt Ihnen wahrscheinlich einen falschen Eindruck davon, wie C++ funktioniert:

derived():base(){ a=0; b=0;} 

Was hier passiert, ist, dass base aufgebaut ist, a ist default-initialisiert auf einen unbestimmten Wert, dann b wird standardmäßig auf einen unbestimmten Wert initialisiert und dann werden zwei Zuweisungen vorgenommen. Ich empfehle einige Untersuchungen zu Initialisierungslisten.

+0

Vielen Dank für das Feedback, mit privaten es funktioniert gut (Ich bekomme Fehler, wenn ich versuche, den Zugriff zu ändern) .Initialisierungslisten notiert :) –

Verwandte Themen