Forum: PC-Programmierung C++ warum sind felder der Basisklasse in abgeleiteter klasse inaccessible?


von Milhouse van Hauten (Gast)


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?

von Jim M. (turboj)


Lesenswert?

Sind die Felder zufällig "private"? Dann ist das so gewollt, in den 
Implementationsdetails soll sich fremder Code nicht einmischen können.

von Sebastian V. (sebi_s)


Lesenswert?

Ansonsten gibts neben private auch noch protected als Access Modifier. 
Hier sind die Member dann auch für abgeleitete Klassen nutzbar.

von Rolf M. (rmagnus)


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.

von Milhouse van Hauten (Gast)


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?

von Le X. (lex_91)


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".

von oop(s) (Gast)


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.

von Le X. (lex_91)


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...

von Rolf Magnus (Gast)


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.

von Potzblitz (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.