www.mikrocontroller.net

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


Autor: Mel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
class test
{
public:
  int t1;
  void set(int a)
  {
    t2 = a;
  }

  int get(void)
  {
    return t2;
  }


private:
  int t2;


protected:
  int t3;

};

class test2 : public test
{
  int t4;
};

int main()
{
  test a;
  test2 b;
  b.set(3);
  cout << b.get();
  system ("pause");
  return 0;
}

Autor: Sven S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Ja, deswegen sind sie ja private.

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so ist es,

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

Autor: Mel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven S. (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mel (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Bjoern (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Bjoern (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.