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.

9.3 Abgeleitete Klassen 217<br />

Um nun nicht <strong>in</strong> begriffliche Probleme für unsere weiteren Betrachtungen<br />

h<strong>in</strong>e<strong>in</strong>zulaufen, möchte ich folgende Konvention festlegen, wie sie <strong>in</strong> der<br />

OO <strong>Softwareentwicklung</strong> üblich ist:<br />

In e<strong>in</strong>er Ableitungshierarchie steht die Basisklasse oben und abgeleitete<br />

Klassen stehen entsprechend unter ihr. Die Aufrufe der Konstruktoren<br />

erfolgen also von oben nach unten <strong>in</strong> der Hierarchie und die Aufrufe der<br />

Destruktoren erfolgen entsprechend umgekehrt von unten nach oben.<br />

Was bedeutet dieses Verhalten nun für Softwareentwickler? Ganz e<strong>in</strong>fach:<br />

Man kann sich immer darauf verlassen, dass e<strong>in</strong> Konstruktor erst dann aufgerufen<br />

wird, wenn die darüber liegenden Klassen <strong>in</strong> der Ableitungshierarchie<br />

bereits vollständig konstruiert wurden. Dementsprechend kann man bereits<br />

im Konstruktor auf die Funktionalität und die Daten der darüber liegenden<br />

Klassen zugreifen, ohne befürchten zu müssen, dass man auf noch un<strong>in</strong>itialisierte<br />

Werte stößt. Ok, ich geb’s ja zu – natürlich stimmt das nur dann,<br />

wenn die Konstruktoren der darüber liegenden Klassen korrekt implementiert<br />

wurden, aber davon gehen wir hier e<strong>in</strong>mal aus.<br />

Im Falle e<strong>in</strong>er e<strong>in</strong>fachen Vererbungshierarchie ist also alles klar. Was<br />

passiert nun bei Mehrfachvererbung? Auch das ist wieder am leichtesten an<br />

e<strong>in</strong>em Beispiel demonstriert (multiple_<strong>in</strong>her_constr_destr_demo.cpp):<br />

10 class RootClassA<br />

11 {<br />

12 public :<br />

13 RootClassA ( ) ;<br />

14 ˜RootClassA ( ) ;<br />

15 } ;<br />

16<br />

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

18 class RootClassB<br />

19 {<br />

20 public :<br />

21 RootClassB ( ) ;<br />

22 ˜RootClassB ( ) ;<br />

23 } ;<br />

24<br />

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

26 class DerivedClassLevelOneA : public RootClassA<br />

27 {<br />

28 public :<br />

29 DerivedClassLevelOneA ( ) ;<br />

30 ˜DerivedClassLevelOneA ( ) ;<br />

31 } ;<br />

32<br />

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

34 class DerivedClassLevelOneB : public RootClassB<br />

35 {<br />

36 public :<br />

37 DerivedClassLevelOneB ( ) ;<br />

38 ˜DerivedClassLevelOneB ( ) ;<br />

39 } ;<br />

40<br />

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

42 class DerivedClassLevelTwo : public DerivedClassLevelOneA ,<br />

43 public DerivedClassLevelOneB<br />

44 {<br />

45 public :

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!