Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
cpp:inheritance:diamond [2010/02/04 11:00]
xin
cpp:inheritance:diamond [2022/09/22 19:58] (aktuell)
Zeile 46: Zeile 46:
 ===== Lösungen ===== ===== Lösungen =====
  
-Es gibt zwei Möglichkeiten das Diamond-Problem zu lösen. Man kann C++ das Problem ​lösen zu Laufzeit lösen lassen oder man benutzt seinen Kopf - im Idealfall bevor man etwas falsches programmiert hat. +Es gibt zwei Möglichkeiten das Diamond-Problem zu lösen. Man kann C++ das Problem ​zur Laufzeit lösen lassen oder man benutzt seinen Kopf - im Idealfall bevor man etwas falsches programmiert hat. 
  
 ==== Lösung 1: interne Basisklassen ===== ==== Lösung 1: interne Basisklassen =====
Zeile 79: Zeile 79:
 == Der FullHDTelevision == == Der FullHDTelevision ==
 <code cpp> <code cpp>
-class FullHDTelevision ​+class FullHDTelevisionWithoutPowerSupply ​
   : public Display   : public Display
 { {
Zeile 94: Zeile 94:
 public: public:
   FullHDTelevision( int minWatts, int maxWatts )   FullHDTelevision( int minWatts, int maxWatts )
-  , PowerConsumer( minWatts, ​int maxWatts )+   : ​PowerConsumer( minWatts, maxWatts )
   {}   {}
 };</​code>​ };</​code>​
Zeile 117: Zeile 117:
 ''​FullHDTelevision''​ und ''​BluRayPlayer''​ funktionieren identisch zu den Varianten, wie sie vorher waren. Die beiden Zwischenklassen ''​FullHDTelevisionWithoutPowerSupply''​ und ''​BluRayPlayerWithoutPowerSupply''​ sind für den Entwickler außerhalb dieser Implementierung uninteressant. Sie erlauben aber die Klasse ''​BluRayFullHDTelevision''​ zusammenzubauen,​ ohne das Diamond-Problem hervorzurufen. ''​FullHDTelevision''​ und ''​BluRayPlayer''​ funktionieren identisch zu den Varianten, wie sie vorher waren. Die beiden Zwischenklassen ''​FullHDTelevisionWithoutPowerSupply''​ und ''​BluRayPlayerWithoutPowerSupply''​ sind für den Entwickler außerhalb dieser Implementierung uninteressant. Sie erlauben aber die Klasse ''​BluRayFullHDTelevision''​ zusammenzubauen,​ ohne das Diamond-Problem hervorzurufen.
 Alle Geräte sind genau einmal von ''​PowerConsumer''​ abgeleitet und können an Funktionen übergeben werden, die einen ''​PowerConsumer''​ als Parameter wünschen. Die FullHD-Bildschirme können über ''​FullHDTelevisionWithoutPowerSupply''​ übergeben werden. Methoden, die ein ''​FullHDTelevisionWithoutPowerSupply''​ können also mit einem ''​FullHDTelevision''​ und einem ''​BluRayFullHDTelevision''​ gefüttert werden. Alle Geräte sind genau einmal von ''​PowerConsumer''​ abgeleitet und können an Funktionen übergeben werden, die einen ''​PowerConsumer''​ als Parameter wünschen. Die FullHD-Bildschirme können über ''​FullHDTelevisionWithoutPowerSupply''​ übergeben werden. Methoden, die ein ''​FullHDTelevisionWithoutPowerSupply''​ können also mit einem ''​FullHDTelevision''​ und einem ''​BluRayFullHDTelevision''​ gefüttert werden.
 +
 +Nun haben wir auch das richtige Gerät beschrieben:​ Statt eines Displays mit Netzteil und einem BluRay-Laufwerk mit Netzteil haben wir ein Gerät beschrieben,​ dass aus einem Display, einem BluRay-Laufwerk und genau einem Netzteil besteht.
  
 ==== Lösung 2: virtuelle Ableitungen ===== ==== Lösung 2: virtuelle Ableitungen =====