Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Vererbung

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
17.11.2006, 15:02 Uhr
~blablaplusplus
Gast


Hallo,

C++:
class klasse :: privat klasse2
{};



benutzt man sowas?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.11.2006, 15:24 Uhr
ao

(Operator)


Man kann es benutzen, um in der Implementierung von klasse die Fähigkeiten von klasse2 zu verwenden. Es ist *keine* Klassenbeziehung der Art "klasse ist eine Spezialisierung von klasse2", wie das bei public-Vererbung der Fall ist, eher ein "klasse verwendet klasse2 für internen Kram", was aber wiederum keinen Außenstehenden was angeht, also warum soll man es groß im Klassenheader verkünden?

Unter Leuten, die viel Klassendesign machen, ist die Ansicht verbreitet, dass das sog. Containment:

C++:
class klasse
{
private:
    klasse2 kl2;
};


in dem Fall die geeignetere Beziehung ist, weil sie das gleiche leistet ohne die Probleme, die eine Vererbungsbeziehung mitbringen kann (Mehrfachvererbung).

Anders ists, wenn klasse2 alle ihre tollen Funktionen protected mitbringt, so dass man gezwungen ist, von ihr zu erben, um sie nutzen zu können. Aber das ist dann oft ein Zeichen für ein krankes Design. Vererbung ist nicht die Lösung für alle Probleme.

Dieser Post wurde am 17.11.2006 um 15:25 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.11.2006, 10:06 Uhr
stephanw
localhorst


Containment mag manchmal gehen, klar. Dann brauche ich aber tatsächlich keine Vererbung. Wenn ich aber virtuelle Funktionen überschreiben will/muss, komme ich um die private/protected Vererbung nicht herum.
--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.11.2006, 10:24 Uhr
ao

(Operator)



Zitat von stephanw:
Containment mag manchmal gehen, klar. Dann brauche ich aber tatsächlich keine Vererbung. Wenn ich aber virtuelle Funktionen überschreiben will/muss, komme ich um die private/protected Vererbung nicht herum.

Da leuchtet mir aber der Zweck nicht ein. Wozu brauche ich private Vererbung im Zusammenhang mit virtuellen Funktionen? Hast du ein Beispiel? Wenn ich Polymorphie will, leite ich public ab.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
20.11.2006, 15:52 Uhr
stephanw
localhorst


Beispiel:

Die Klasse Watcher soll ihre Funktionalität in einem Thread ausführen, aber kein öffentliches Thread-Interface haben. Die Thread-Klasse hat ein virtuelles void run() . Lösung:


C++:

class Watcher : private Thread
{
public:
  virtual void startWatch();
  virtual void stopWatch();

protected:

  virtual void run() // überschreibt Thread::run()
  {
    // do the stuff
  }
};




In dem Fall mit der Indirektion muss ich eine Hilfsklasse öffentlich von Thread erben lassen, die ich dann in Watcher benutzen kann. Damit habe ich eine Klasse mehr. Ob das gut oder schlecht ist, hängt sicher vom Einzelfall ab.

Ich gebe zu, dass ich es bisher selbst in produktiver Umgebung erst einmal genutzt habe. Wenn man jedoch diese "Implementierungs"-Vererbung kennt, sieht man vielleicht auch andere Anwendungsfälle.

Edit: natürlich muss ich hier den Thread-Header einbinden. Wenn das ein Problem ist, weil das Watcher-Interface auch einem Kunden bekannt sein soll, der die Thread-Bibliothek nicht haben muss, würde ich ein Interface Watcher herrausziehen und nur dieses herausgeben.


C++:
struct Watcher // dieses Interface geht zum Kunden
{
  virtual void startWatch() = 0;
  virtual void stopWatch() = 0;
};


class MyWatcher : public Watcher, private Thread // Implementierung
{
public:
  virtual void startWatch()
  {
    Thread::start();
  }
  virtual void stopWatch()
  {
    Thread::stop();
  }

protected:
  virtual void run()
  {
    // do stuff
  }
};



--
Reden ist Schweigen und Silber ist Gold.

Dieser Post wurde am 20.11.2006 um 16:07 Uhr von stephanw editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.11.2006, 10:45 Uhr
ao

(Operator)


Ah ja, interessant.

Ich sehe solche Dinge inzwischen häufiger durch die C#- oder Java-Brille, und da überlegt man sich genau, ob man wirklich ableiten soll (weil man das bekanntlich bei jeder Klasse nur einmal tun kann).

Wobei man da ja unterscheiden muss zwischen Ableitung (von einer Basisklasse) und Implementierung einer Schnittstelle, dies würde ja in C++ der (public-) Ableitung von einer rein virtuellen Basisklasse entsprechen.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: