C++ Vererbung, Problem mit Private

Gast #2033914
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
}
Gast #2033922
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.
Gast #2034003
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
#2034145
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.
#2034158
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.
#2034173
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 :-)
Gast #2034189
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.

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