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.

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

BaseB : : dynamicallyBoundMethod c a l l e d<br />

constructor of DerivedB<br />

DerivedB : : dynamicallyBoundMethod c a l l e d<br />

constructor of DerivedC<br />

DerivedC : : dynamicallyBoundMethod c a l l e d<br />

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

∗∗∗∗∗ new t e s t o b j p t r ∗∗∗∗∗<br />

constructor of BaseA<br />

BaseA : : dynamicallyBoundMethod c a l l e d<br />

constructor of DerivedA<br />

DerivedA : : dynamicallyBoundMethod c a l l e d<br />

constructor of BaseB<br />

BaseB : : dynamicallyBoundMethod c a l l e d<br />

constructor of DerivedB<br />

DerivedB : : dynamicallyBoundMethod c a l l e d<br />

constructor of DerivedC<br />

DerivedC : : dynamicallyBoundMethod c a l l e d<br />

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

∗∗∗∗∗ c a l l i n g method on t e s t o b j p t r ∗∗∗∗∗<br />

DerivedC : : dynamicallyBoundMethod c a l l e d<br />

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

∗∗∗∗∗ d e l e t e t e s t o b j p t r ∗∗∗∗∗<br />

d e s t r u c t o r of DerivedC<br />

DerivedC : : dynamicallyBoundMethod c a l l e d<br />

d e s t r u c t o r of DerivedB<br />

DerivedB : : dynamicallyBoundMethod c a l l e d<br />

d e s t r u c t o r of BaseB<br />

BaseB : : dynamicallyBoundMethod c a l l e d<br />

d e s t r u c t o r of DerivedA<br />

DerivedA : : dynamicallyBoundMethod c a l l e d<br />

d e s t r u c t o r of BaseA<br />

BaseA : : dynamicallyBoundMethod c a l l e d<br />

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

∗∗∗∗∗ now t e s t o b j e c t ’ s l i f e t i m e ends ∗∗∗∗∗<br />

d e s t r u c t o r of DerivedC<br />

DerivedC : : dynamicallyBoundMethod c a l l e d<br />

d e s t r u c t o r of DerivedB<br />

DerivedB : : dynamicallyBoundMethod c a l l e d<br />

d e s t r u c t o r of BaseB<br />

BaseB : : dynamicallyBoundMethod c a l l e d<br />

d e s t r u c t o r of DerivedA<br />

DerivedA : : dynamicallyBoundMethod c a l l e d<br />

d e s t r u c t o r of BaseA<br />

BaseA : : dynamicallyBoundMethod c a l l e d<br />

Die erste Auffälligkeit <strong>in</strong> unserem Testprogrämmchen zeigt sich <strong>in</strong> Zeile 21:<br />

Der Destruktor von BaseA ist virtual! Ebenso s<strong>in</strong>d alle Destruktoren aller<br />

anderen Klassen als virtual deklariert. Dies hat noch nichts mit dem Bauen<br />

der virtual Table an sich zu tun, sondern hat e<strong>in</strong>en ganz anderen aber sehr<br />

wichtigen Grund. Dazu werfen wir e<strong>in</strong>mal e<strong>in</strong>en Blick auf die Zeilen 200–<br />

206. In diesen Zeilen wird e<strong>in</strong> Objekt vom Typ DerivedC dynamisch erzeugt,<br />

allerd<strong>in</strong>gs wird dieser Po<strong>in</strong>ter <strong>in</strong> e<strong>in</strong>er Variable vom Typ BaseA * gehalten.<br />

Dies ist, wie bereits bekannt ist, absolut zulässig und gängige Praxis, z.B. bei<br />

Parameterübergaben, wie wir sie schon kennen gelernt haben. In Zeile 204<br />

sieht man wieder, was sowieso schon bekannt ist: Beim Call e<strong>in</strong>er virtual<br />

Methode wird zur Laufzeit entschieden, welche der Implementationen <strong>in</strong> der<br />

Ableitungshierarchie nun tatsächlich aufgerufen wird.<br />

Zeile 206 allerd<strong>in</strong>gs ist nun des Pudels Kern, was die om<strong>in</strong>ösen virtuellen<br />

Destruktoren anbelangt: Stellen wir uns e<strong>in</strong>fach vor, die Destruktoren

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!