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.

15.6 RTTI und dynamic cast im OO Kontext 481<br />

• Die type_<strong>in</strong>fo Objekte unterstützen sowohl den == als auch den != Operator.<br />

Aussagen über Typen können nur gesichert getroffen werden, wenn<br />

diese beiden verwendet werden.<br />

• Ke<strong>in</strong>esfalls dürfen Po<strong>in</strong>ter auf type_<strong>in</strong>fo Objekte mite<strong>in</strong>ander verglichen<br />

werden, denn es ist nicht garantiert, dass es zu e<strong>in</strong>en bestimmten Typ nur<br />

e<strong>in</strong> e<strong>in</strong>ziges type_<strong>in</strong>fo Objekt gibt.<br />

• Bisher noch nicht erwähnt, aber trotzdem <strong>in</strong>teressant ist, dass type_<strong>in</strong>fo<br />

Objekte die Methode<br />

bool before(const type_<strong>in</strong>fo&)<br />

unterstützen, die e<strong>in</strong>e Sortierung zwischen solchen Objekten möglich macht.<br />

Vorsicht Falle: Was sich auch immer bei verschiedenen Implementationen<br />

als Reihenfolge durch Verwendung von before ergibt sagt überhaupt<br />

nichts über Ableitungshierarchien aus! Manche Entwickler treffen leider<br />

Fehlannahmen wie z.B. “e<strong>in</strong> type_<strong>in</strong>fo Objekt der Basisklasse wird genau<br />

vor dem der davon abgeleiteten Klassen gereiht”. Dies ist falsch,<br />

auch wenn es manchmal tatsächlich so aussehen könnte, als ob es zutreffen<br />

würde.<br />

• Die Methode name dient dem Herausf<strong>in</strong>den des (<strong>in</strong>ternen!) Typnamens<br />

e<strong>in</strong>es Objekts.<br />

• E<strong>in</strong> Aufruf von type_<strong>in</strong>fo kann e<strong>in</strong>e bad_typeid Exception werfen, wenn<br />

ke<strong>in</strong>e Chance besteht, den gefragten Typ herauszuf<strong>in</strong>den. Dies ist bei e<strong>in</strong>em<br />

dereferenzierten 0 Po<strong>in</strong>ter der Fall.<br />

So nett die Anwendungsmöglichkeiten von typeid auch s<strong>in</strong>d, e<strong>in</strong>es kann man<br />

damit nicht tun, nämlich Typkompatibilitäten feststellen, die sich durch<br />

die Ableitungshierarchie ergeben. Dazu müssen wir unseren bekannten<br />

dynamic_cast Operator heranziehen und e<strong>in</strong>e Eigenheit desselben ausnützen,<br />

die bisher noch nicht bekannt ist: In Abschnitt 9.4.4 wurde bereits erwähnt,<br />

dass dynamic_cast e<strong>in</strong>e bad_cast Exception wirft, wenn e<strong>in</strong> Cast nicht<br />

zulässig ist. Das ist allerd<strong>in</strong>gs nur die halbe Wahrheit. In Wirklichkeit ist<br />

dynamic_cast vollständig so def<strong>in</strong>iert:<br />

• Mittels dynamic_cast können (ausschließlich) Casts zwischen Po<strong>in</strong>tern auf<br />

Objekte oder zwischen Referenzen auf Objekte durchgeführt werden.<br />

• Wendet man dynamic_cast auf Po<strong>in</strong>ter an, dann können folgende zwei<br />

Fälle passieren:<br />

1. Wenn der Cast zulässig ist, so wird e<strong>in</strong> Po<strong>in</strong>ter auf das gewandelte Objekt<br />

geliefert.<br />

2. Wenn der Cast nicht zulässig ist, so wird e<strong>in</strong> 0 Po<strong>in</strong>ter geliefert. Es wird<br />

<strong>in</strong> diesem Fall ke<strong>in</strong>e Exception geworfen!<br />

Dieses Verhalten ist sehr s<strong>in</strong>nvoll, denn damit kann man dynamic_cast dazu<br />

verwenden, Kompatibilitäten festzustellen, ohne e<strong>in</strong>e Exception befürchten<br />

zu müssen, wie z.B. <strong>in</strong> Zeile 70 zu sehen ist. Für alle Leser, die mit

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!