30.06.2013 Aufrufe

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

210 9. Klassen <strong>in</strong> <strong>C++</strong><br />

27 } ;<br />

28<br />

29 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />

30 /∗<br />

31 ∗ Pr<strong>in</strong>tableObject<br />

32 ∗<br />

33 ∗ A simple p r i n t a b l e o bject<br />

34 ∗<br />

35 ∗/<br />

36<br />

37 class Pr<strong>in</strong>tableObject<br />

38 {<br />

39 protected :<br />

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

41 Pr<strong>in</strong>tableObject ( const char ∗ s t r i n g r e p ) ;<br />

42 public :<br />

43 ˜ Pr<strong>in</strong>tableObject ( ) ;<br />

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

45 } ;<br />

Abgesehen davon, dass <strong>in</strong> Realität natürlich für anzeigbare sowie für druckbare<br />

Objekte bei weitem mehr vonnöten ist als e<strong>in</strong>e e<strong>in</strong>fache Methode<br />

getStr<strong>in</strong>gRep, ist die Intention h<strong>in</strong>ter diesen beiden Klassen im Pr<strong>in</strong>zip recht<br />

nett: Sie speichern die Repräsentation und liefern sie direkt auf Anfrage.<br />

Klassen, die von e<strong>in</strong>er der beiden ableiten, müssen also nur im Konstruktor<br />

die anfängliche Repräsentation mitgeben und danach bei Bedarf ändern<br />

(über die Member Variable str<strong>in</strong>g_rep_), sofern sich der anzeigbare Inhalt<br />

geändert hat. Der Rest wird von der Basis übernommen.<br />

Jetzt aber wollen wir e<strong>in</strong>e Klasse schreiben, die sowohl anzeigbar als auch<br />

druckbar ist. S<strong>in</strong>nigerweise leiten wir diese Klasse von beiden ab und alles<br />

funktioniert wunderbar... oder auch nicht! Sagen wir, e<strong>in</strong>e Klasse MyObject<br />

würde e<strong>in</strong>fach folgendermaßen aussehen:<br />

1 class MyObject : public DisplayableObject ,<br />

2 public Pr<strong>in</strong>tableObject<br />

3 {<br />

4 public :<br />

5 MyObject ( ) ;<br />

6 ˜MyObject ( ) ;<br />

7 } ;<br />

Abgesehen davon, dass diese Klasse nicht viel darstellt, aber das tut hier<br />

nichts zur Sache, was würde passieren, wenn man irgendwo im Programm<br />

z.B. die folgenden beiden Zeilen stehen hat?<br />

MyObject my_object;<br />

my_object.getStr<strong>in</strong>gRep();<br />

Richtig erkannt! Die Ambiguität ist nicht auflösbar, denn woher soll der<br />

Compiler denn wissen, ob die Implementation aus DisplayableObject oder<br />

die aus Pr<strong>in</strong>tableObject nun die gewünschte ist. Damit endet der Versuch<br />

der Übersetzung mit e<strong>in</strong>em Fehler. Irgendwie muss man also dafür sorgen,<br />

dass der Compiler wieder beruhigt wird und weiß, was er tun soll. Die e<strong>in</strong>zige<br />

Möglichkeit, das zu erreichen, besteht dar<strong>in</strong>, dass es <strong>in</strong> der Klasse MyObject

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!