Forum: PC-Programmierung C++ Vererbung, Problem mit Private


von Mel (Gast)


Lesenswert?

Hallo zusammen,
Ich hab folgendes Problem. Ich wollte ein Testprogramm zum Thema 
Vererbung machen. In der Klasse test ist die Variable t2 unter private, 
sprich die sollte nicht mitvererbt werden oder? Die Klasse test2 erbt 
von der Klasse test. Jetzt kann ich aber trotzdem über get uns set auf 
die Variable t2 zugreifen (über eine Instanz der Klasse test2). Aber 
soweit ich das kennengelernt haben werden Variable unter private nicht 
mit vererbt. Warum exisitert diese Variable dann trotzdem in einer 
Instanz von test2?

LG Mel
1
class test
2
{
3
public:
4
  int t1;
5
  void set(int a)
6
  {
7
    t2 = a;
8
  }
9
10
  int get(void)
11
  {
12
    return t2;
13
  }
14
15
16
private:
17
  int t2;
18
19
20
protected:
21
  int t3;
22
23
};
24
25
class test2 : public test
26
{
27
  int t4;
28
};
29
30
int main()
31
{
32
  test a;
33
  test2 b;
34
  b.set(3);
35
  cout << b.get();
36
  system ("pause");
37
  return 0;
38
}

von Sven S. (Gast)


Lesenswert?

Private, protected und public kennzeichnen nur die Sichtbarkeit der 
Methoden/Attributen.

Die Variable wird natürlich mitvererbt, da sie für die Funktion der 
Basisklasse wichtig ist (oder wie soll dann das Get funktionieren?).

Das mit Get und Set ist eine beliebte Methode, dass man von aussen auf 
private Variablen zugreifen kann, ohne etwas über die interen 
Implementierung wissen zu müssen. Zusätzlich kann man get und set 
überladen und dann auf eine andere Variable zugreifen.

von Johann (Gast)


Lesenswert?

Mel schrieb:
> Aber
> soweit ich das kennengelernt haben werden Variable unter private nicht
> mit vererbt

Natürlich werden auch private deklarierte variablen (und Funktionen) 
mitvererbt. Du kannst sie in einer abgeleiteten Klasse nur nicht direkt 
nutzen.

von Mel (Gast)


Lesenswert?

Achso, nur wie kann ich die private deklarierten Variablen dann in der 
abgeleiteten Klasse nutzen? Muss das dann auch wieder über get uns set 
passieren?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Mel schrieb:
> Muss das dann auch wieder über get uns set
> passieren?

Ja, deswegen sind sie ja private.

von D. I. (Gast)


Lesenswert?

so ist es,

so kann man zum beispiel überprüfungen einbauen damit niemand unfug mit 
der variable anstellt

von Mel (Gast)


Lesenswert?

Unser Prof hat nämlich in seinem Script stehen:

"Die abgeleitete Klasse besitzt alle Methoden und Datenelemente der 
Basisklasse mit Ausnahme von: Datenelementen und Methoden der 
Basisklasse mit dem Schlüsselwort private"

Das hat mich dann verwirrt dass das trotzdem funktioniert hat. Hoffen 
wir mal dass ich dann in der Prüfung nix schreibe was er für falsch 
hält:)

Aber vielen Dank für eure schnellen Antworten

von Sven S. (Gast)


Lesenswert?

Das ist wohl definitv falsch, denn sie sind noch da, nur die 
Sichtbarkeit ist nicht gegeben.

von Karl H. (kbuchegg)


Lesenswert?

Mel schrieb:
> Unser Prof hat nämlich in seinem Script stehen:
>
> "Die abgeleitete Klasse besitzt alle Methoden und Datenelemente der
> Basisklasse mit Ausnahme von: Datenelementen und Methoden der
> Basisklasse mit dem Schlüsselwort private"
>

Der Satz ist so Unsinn.
Die abgeleitete Klasse besitzt grundsätzlich alle Methoden und 
Datenelemente der Basisklasse. Ein Objekt der ageleiteten Klasse IST 
gleichzeitig auch ein Objekt der Basisklasse. In jedem Objekt der 
abgeleiteten Klasse steckt auch immer ein vollständiges Objekt der 
Basisklasse drinnen.

Aber: verwendbar sind auch in einer abgeleiteten Klasse nur die 
Methoden und Datenelemente die nicht 'private' markiert sind.

von Mel (Gast)


Lesenswert?

Ahh gut ok, aber was kann ich dann mit den Sachen aus private anstellen, 
wenn ich die nicht wirklich verwenden kann:/?

von Karl H. (kbuchegg)


Lesenswert?

Mel schrieb:
> Ahh gut ok, aber was kann ich dann mit den Sachen aus private anstellen,
> wenn ich die nicht wirklich verwenden kann:/?

Eine Klasse macht Methoden und/oder Datenmember dann private, wenn sie 
verhindern will, dass abgeleitete Klassen und/oder Friend-Klassen darauf 
zugreifen können.

In einem gewissen Sinne errichtet private einen Zaun um diese 
Klassenbestandteile und signalisiert so: Wenn du etwas von mir willst, 
dann benutze bitte die offiziellen Kanäle (public oder protected) und 
pfusch mir nicht direkt an den Werten rum. Ich alleine habe die 
Oberhoheit darüber und ich will nicht, dass du dir über das 
Hintertürchen 'dann leite ich eben davon ab' Zugang zu meinen 
Datenmembern verschaffst.
Bei Methoden sind es meistens irgendwelche Hilfsmethoden, von denen die 
Basisklasse ausgeht, dass ausser ihr die keiner jemals brauchen wird 
oder aber Methoden, die nicht gefahrlos benutzt werden können, weil zb 
bestimmte Reihenfolgen von Funktionsaufrufen einzuhalten sind.

von Mel (Gast)


Lesenswert?

Gut also macht die Verwendung von Private nur Sinn, wenn ich diese 
Variable/Methode nur in Instanzen dieser Klasse verwenden will und 
nirgendwo anders?

von Bjoern (Gast)


Lesenswert?

Nö, macht doch Sinn, wenn Du nur die von Dir erlaubten Wege zulassen 
willst.

von Karl H. (kbuchegg)


Lesenswert?

Mel schrieb:
> Gut also macht die Verwendung von Private nur Sinn,

Das ist die falsche Sichtweise.
Grundsätzlich sollte in einer Klasse alles private sein, zumindest bei 
den Datenmembern.
Und je nach Anforderungen lockert man dann diesen Schutz. Bei Methoden 
ist das meistens unkritisch, bei Datenmember hingegen wehrt man sich als 
C++ Programmierer nach Leibeskräften dagegen. Wobei der Wechsel von 
private nach protected weniger schlimm ist, als wie wenn man nach public 
geht. Datenmember die public sind, sind oft ein untrügerisches Zeichen 
dafür, dass der Programmierer noch nicht in der OOP Welt angekommen ist.

Eine Klasse will ihre Kontrolle über Datenmember nur durch Androhung von 
massiver Gewalt abgeben :-)

von Bjoern (Gast)


Lesenswert?

Bsp.

class Lichtschalter
private var SchalterPos, RelaisPos

public func SetSchalterPos(bool an/aus)
  if(an)
    begin
    SchalterPos = true
    RelaisPos = true
    end
  else
    begin
    SchalterPos = false
    RelaisPos = false
    end
endfunc


Mit dem umlegen des Schalters muss nuch die Variable RelaisPos gesetzt 
werden, um tatsächlich das Licht zu schalten. Das geht nur über die 
Verwendung von SetSchalterPos. Wäre SchalterPos public, könntest Du die 
Variable ändern ohne das das Relais geschaltet werden würde. Ein 
Verhalten was man nicht will.

von Mel (Gast)


Lesenswert?

Ahhhhh gut alles klar, ich glaub so langsam blick ichs ein wenig:)
Vielen Dank nochmal für eure Bemühungen und die guten Beispiele

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.