private
-
Hey ihr,
Ich habe mal eine Frage zum Folgenden Code:
#include <iostream> using namespace std; class Hallo { private: int a; public: Hallo(int aa) : a(aa) { } void funktion(Hallo& h) { cout << h.a << endl; } }; int main() { Hallo h(2); Hallo b(2); b.funktion(h); }Und zwar wundert mich, warum das Objekt b auf private-Elemente des Objektes h zugreifen darf.
Ich hatte bisher oft so gearbeitet- doch jetzt ist mir gerade aufgefallen, dass das ja geht und ichs komisch finde.
Woran liegt das?cya
David
-
Zugriffsbeschränkung bezieht sich auf die Klasse, nicht auf das Objekt. Sprich alles in class Hallo darf an private Daten der Klasse Hallo, unabhängig von konkreten Instanzen.
-
Was beim genaueren Nachdenken besonders viel Sinn im Bezug auf Copy-Konstruktoren und -Operatoren macht.

-
Wow- das Fellhuhn hat sogar erraten, wie ich überhaupt auf die Idee gekommen bin hier nachzufragen.
War grad nen Zuweisungsoperator am schreiben als es mir auffiel.Aber wo ich jetzt schon hier Fragen zum Zugriffsspezifizierer stelle:
private Elemente werden nicht mitvererbt, oder?
cya
David
-
777 schrieb:
private Elemente werden nicht mitvererbt, oder?
Doch natürlich werden sie mitvererbt, sonst hätten die geerbten Methoden der Basisklasse große Probleme, diese Elemente anzusprechen. Allerdings sind private Basisklassenelemente in der abgeleiteten Klasse nicht zugreifbar.
-
okay verstanden- ist ja auch logisch- hatte grad mal mit sizeof den Test gemacht
-
777 schrieb:
private Elemente werden nicht mitvererbt, oder?
Klares jein: Sie werden insofern mitvererbt, als dass Objekte abgeleiteter Klassen ein komplettes Unterobjekt der Basisklasse beinhalten, und damit auch deren private Member. Sie werden insofern NICHT mitvererbt, als die abgeleitete Klasse keinerlei Zugriff auf die privaten Member der Basisklasse hat. Allerdings sind die privaten Member der Basisklasse in der abgeleiteten Klasse (wie in jedem sonstigen Code der die Definition der Basisklasse kennt) sichtbar:
class B { private: int a; }; class D : public B { void foo() {a = 4;} };Der Compiler wird hier nicht bemaengeln, dass a nicht bekannt ist, da er a durchaus findet, naemlich in B. Beim Check auf Zugriffsberechtigung wird er dann bemaengeln, dass a private in B ist und D deshalb keinen Zugriff bekommt.
-
ohh doch stimmt