Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| 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 ===== | ||