C++ warum sind felder der Basisklasse in abgeleiteter klasse inaccessible?

Gast #4794131
Lesenswert?

Hallo zusammen,

ich stolpere gerade über etwas, das mich schon mal gezwickt hat:

Wenn ich eine Basisklasse  habe und die Basisklasse public vererbe, 
warum sind Felder der Basisklasse trotzdem für die abgeleitete Klasse 
nicht erreichbar?

Was ist der Nutzen davon?
#4794209
Lesenswert?

Milhouse van Hauten schrieb:
> Hallo zusammen,
>
> ich stolpere gerade über etwas, das mich schon mal gezwickt hat:
>
> Wenn ich eine Basisklasse  habe und die Basisklasse public vererbe,
> warum sind Felder der Basisklasse trotzdem für die abgeleitete Klasse
> nicht erreichbar?

Was in der Basisklasse private ist, ist nur von dort aus nutzbar und von 
nirgends anders, PUNKT. Wie du ableitest, spielt dabei keine Rolle.

> Was ist der Nutzen davon?

Der Nutzen von private ist, dafür zu sorgen, dass auf interne Daten nur 
auf kontrolliertem Weg zugegriffen werden kann.
Gast #4794578
Lesenswert?

Es machte mich deshalb stuzig, weil eine Ableitung eine 
"Ist-Ein-Beziehung" ist. Nach der Definition IST die abgeleitete Klasse 
eine Basisklasse. Deswegen sah ich den Grund nicht, auf "meine eigenen 
Felder" nicht zugreifen zu können.

Wenn ich in einer Basisklasse eine public int amlege und die Basisklasse 
mit public an eine andere Klasse vererbe, ist diese int dann auch in der 
abgeleiteten Klasse public?
#4794601
Lesenswert?

Milhouse van Hauten schrieb:
> Es machte mich deshalb stuzig, weil eine Ableitung eine
> "Ist-Ein-Beziehung" ist. Nach der Definition IST die abgeleitete Klasse
> eine Basisklasse. Deswegen sah ich den Grund nicht, auf "meine eigenen
> Felder" nicht zugreifen zu können.

Und unter Java hättest du damit recht, imho.
Tatsächlich kenn ich spontan mehrere Beispiele von Leuten, die über das 
selbe Problem gestolpert sind.
Anscheinend finden also viele diese Lösung nicht intuitiv.

C++ hat sich an der Stelle halt entschieden, ein wenig restriktiver zu 
sein.
Sollte man verbuchen unter "ist halt so, merk ich mir, problem solved".
Gast #4794630
Lesenswert?

Le X. schrieb:
> Milhouse van Hauten schrieb:
>> Es machte mich deshalb stuzig, weil eine Ableitung eine
>> "Ist-Ein-Beziehung" ist.

Wenn du damit auf das Thema Polymorphie anspielen willst:
Hierfür ist lediglich die public-Schnittstelle entscheidend.

> Und unter Java hättest du damit recht, imho.

Nein, protected vs. private verhält sich unter Java exakt genau so wie 
unter C++.

In Smalltalk hingegen ist private sogar noch restriktiver, dort können 
selbst Objekte der gleichen Klasse nicht auf die privaten Teile ihrer 
"Geschwister"-Objekte zugreifen.

> Tatsächlich kenn ich spontan mehrere Beispiele von Leuten, die über das
> selbe Problem gestolpert sind.
> Anscheinend finden also viele diese Lösung nicht intuitiv.

Intuition ist an der Stelle auch nicht wirklich zielführend. Mal ein 
C++-Grundlagenbuch in die Hand zu nehmen wäre eventuell sinnvoller.
#4794734
Lesenswert?

oop(s) schrieb:
> Nein, protected vs. private verhält sich unter Java exakt genau so wie
> unter C++.

Tatsächlich. Mein letzter Java-Kontakt ist nun aber auch ein paar 
Jährchen her. Hatte irgendwie in Erinnerung dass Vererbung dort 
grundsätzlich public wär. Auch OK.

oop(s) schrieb:
> Intuition ist an der Stelle auch nicht wirklich zielführend. Mal ein
> C++-Grundlagenbuch in die Hand zu nehmen wäre eventuell sinnvoller.

Ja ist es.
Ich kann aber den Gedankengang des TOs schon irgendwo nachvollziehen.

Milhouse van Hauten schrieb:
> Es machte mich deshalb stuzig, weil eine Ableitung eine
> "Ist-Ein-Beziehung" ist. Nach der Definition IST die abgeleitete Klasse
> eine Basisklasse. Deswegen sah ich den Grund nicht, auf "meine eigenen
> Felder" nicht zugreifen zu können.

Naja jetzt weiß er Bescheid...
Gast #4794911
Lesenswert?

Milhouse van Hauten schrieb:
> Es machte mich deshalb stuzig, weil eine Ableitung eine
> "Ist-Ein-Beziehung" ist. Nach der Definition IST die abgeleitete Klasse
> eine Basisklasse. Deswegen sah ich den Grund nicht, auf "meine eigenen
> Felder" nicht zugreifen zu können.

Nun, eine Klasse sollte ja erstmal in sich abgeschlossen sein. Zugriff 
auf ihre privaten Members macht sie nur selber - kein anderer kann 
dazwischenfunken. Durch die Verwendung von private sagt der Entwickler, 
dass er das auch genau so will. Das soll daher auch durch abgeleitete 
Klassen nicht ausgehebelt werden können. Wenn der Entwickler der 
Basisklasse will, dass die abgeleitete Klasse auf ein Element zugreift, 
muss es eben in der Basisklasse mindestens protected sein - genau dafür 
ist dieses ja da. Wer zugreifen kann, wird also von der Klasse 
gesteuert, in der das Element definiert ist, nicht von der davon 
abgeleiteten. Diese kann den Zugriff höchstens noch weiter einschränken 
aber nicht erweitern.
- Für mich ein logisches Konzept.

> Wenn ich in einer Basisklasse eine public int amlege und die Basisklasse
> mit public an eine andere Klasse vererbe, ist diese int dann auch in der
> abgeleiteten Klasse public?

Ja.
Gast #4794947
Lesenswert?

Milhouse van Hauten schrieb:
> Es machte mich deshalb stuzig, weil eine Ableitung eine
> "Ist-Ein-Beziehung" ist. Nach der Definition IST die abgeleitete Klasse
> eine Basisklasse.

Vom Konzept her, aber nicht was die konkrete Implementierung betrifft. 
Natürlich kann eine Basisklasse Implementierungsdetails besitzen, die 
von abgeleiteten Klassen nicht verändert werden dürfen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren