30.06.2013 Aufrufe

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

9.3 Abgeleitete Klassen 209<br />

thode aus DisplayableObject und nicht, wie <strong>in</strong> unserer ersten Version aus<br />

GameCard.<br />

Die Implementation dieser Version (memory_game_card_v4.cpp) ist im<br />

Pr<strong>in</strong>zip vollkommen äquivalent zur vorherigen Implementation. Die e<strong>in</strong>zige<br />

Ausnahme ist das Inkludieren von memory_game_card_v4.h. Aus diesem<br />

Grund erspare ich mir hier das Abdrucken des Source Codes. Auch das Testprogramm<br />

(memory_game_card_v4_test.cpp) hat sich bis auf e<strong>in</strong> geändertes<br />

Inkludieren nicht verändert. Ebenso wurde auch das dazugehörige Makefile<br />

(MemoryGameCardTestV4Makefile) nur entsprechend adaptiert, um auch<br />

displayable_object.cpp korrekt zu compilieren. Also möchte ich auch mit<br />

diesen Files nicht s<strong>in</strong>nlos Seiten im Buch füllen.<br />

Wie leicht e<strong>in</strong>zusehen ist, ist Mehrfachvererbung e<strong>in</strong>e sehr saubere<br />

OO Möglichkeit, um verschiedene, vone<strong>in</strong>ander unabhängige Eigenschaften<br />

<strong>in</strong> verschiedenen Ableitungshierarchien getrennt vone<strong>in</strong>ander zu modellieren.<br />

Sollte e<strong>in</strong>e Klasse mehrere Eigenschaften <strong>in</strong> sich vere<strong>in</strong>en, dann kann dies<br />

durch multiple Inheritance sehr elegant gelöst werden. E<strong>in</strong>e solchermaßen<br />

abgeleitete Klasse erbt alle Eigenschaften aller verschiedenen Basisklassen.<br />

Jedoch kann es dabei auch zu e<strong>in</strong> paar technischen Problemen kommen,<br />

wenn man nicht aufpasst! Wenden wir uns e<strong>in</strong>mal e<strong>in</strong>em leicht zu lösenden<br />

Problem zu, bevor wir <strong>in</strong> Abschnitt 9.4 zu den harten Brocken kommen: Was<br />

passiert, wenn beide Basisklassen e<strong>in</strong>- und dieselbe Methode implementieren?<br />

Der Begriff e<strong>in</strong>- und dieselbe bezieht sich natürlich auf die vollständige Signatur,<br />

also auch den Parametersatz. Würde der Parametersatz verschieden<br />

se<strong>in</strong>, so würde sich ja e<strong>in</strong>fach e<strong>in</strong>e problemlos aufzulösende Overload<strong>in</strong>g Situation<br />

ergeben. Haben wir also wirklich komplette Gleichheit, welche der<br />

Implementationen wird nun bei e<strong>in</strong>em Aufruf vom Compiler e<strong>in</strong>gesetzt? Wie<br />

sich unschwer erraten lässt, ke<strong>in</strong>e der beiden! Der Compiler wird sich e<strong>in</strong>fach<br />

beschweren, dass er e<strong>in</strong>e Ambiguität im Aufruf entdeckt hat und damit<br />

das weitere Übersetzen verweigern. Das bedeutet also, dass die Entwickler<br />

die Ambiguität per Hand auflösen müssen, um den Compiler zu beruhigen.<br />

Wie dies passiert, sehen wir uns am besten an e<strong>in</strong>em kle<strong>in</strong>en Beispiel an<br />

(method_ambiguity_problem.cpp). Die erste Betrachtung gilt zwei Klassendeklarationen<br />

<strong>in</strong> diesem Progrämmchen:<br />

11 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />

12 /∗<br />

13 ∗ DisplayableObject<br />

14 ∗<br />

15 ∗ A simple d i s p l a y a b l e o bject<br />

16 ∗<br />

17 ∗/<br />

18<br />

19 class DisplayableObject<br />

20 {<br />

21 protected :<br />

22 char ∗ s t r i n g r e p ;<br />

23 DisplayableObject ( const char ∗ s t r i n g r e p ) ;<br />

24 public :<br />

25 ˜ DisplayableObject ( ) ;<br />

26 const char ∗ getStr<strong>in</strong>gRep ( ) ;

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!