07.10.2013 Aufrufe

Vorlesungsskript - Hochschule Emden/Leer

Vorlesungsskript - Hochschule Emden/Leer

Vorlesungsskript - Hochschule Emden/Leer

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.

c○ Prof. Dr. B. Bartning, HS <strong>Emden</strong>/<strong>Leer</strong> Rumpfskript ” Informatik I/II“ (WS/SS 2010/11) 128<br />

der Basisklasse überladene Funktionen gleichen Namens vorhanden, so werden sie alle verdeckt<br />

△! . Diese verdeckten Elemente sind noch vorhanden; auf sie kann – Zugriffserlaubnis<br />

vorausgesetzt – mit der Spezifizierung durch den Basisklassen-Namen zugegriffen werden<br />

(BasisKlassenName::ElementName).<br />

class Basis {<br />

public: // public hier nur zur Verdeutlichung (vereinfachter Zugriff)<br />

int a;<br />

void fkt(int i);<br />

void fkt(double d);<br />

void aktion();<br />

};<br />

class Ableitung : public Basis {<br />

float a; // überdeckt Basis::a<br />

int fkt(char *str); // überdeckt Basis::fkt(int) und Basis::fkt(double)<br />

void aktion(); // überdeckt Basis::aktion()<br />

};<br />

Innerhalb der Klasse Ableitung kann auf das a der Klasse Basis durch volle Spezifizierung<br />

Basis::a zugegriffen werden, auf die überdeckten Funktionen z. B. durch Basis::fkt(16),<br />

Basis::fkt(1.0) oder Basis::aktion().<br />

Anm1 Die Verdeckung und der Zugriff auf die Basisklasse durch Spezifizierung liefe genauso ab,<br />

wenn das Datenelement der abgeleiteten Klasse den gleichen Typ hätte: int a;<br />

Anm2 Die Verdeckung geschieht auch dann, wenn kein Zugriff möglich wäre, beispielsweise bei<br />

private-Zugriffsspezifizierer in der Basisklasse (Bsp.: private: int a; in Klasse Basis.)<br />

Diese Regel soll sicherstellen, daß die Bedeutung von Namen in abgeleiteten Klassen unabhängig<br />

von der Zugriffsspezifikation in einer Basisklasse ist.<br />

Anm3 Die Verdeckung geschieht nur mit dem Namen. In einer abgeleiteten Klasse kann man daher<br />

keine Elementfunktion der Basisklasse überladen △! . Wie schon oben erwähnt, werden<br />

alle Elementfunktionen gleichen Namens verdeckt, vgl. auch (EffCpp/Kap. 50). Dieses ist auch<br />

sinnvoll, da sich sonst bei einer großen Klassenhierarchie leicht Fehler einschleichen könnten.<br />

Anm4 Diese Verdeckung geschieht sinngemäß auch bei Operatoren. Beispiele: Ein Präfix-Inkrementoperator<br />

aus einer Basisklasse wird durch die Definition des Postfix-Inkrementoperators in<br />

einer abgeleiteten Klasse verdeckt (oder umgekehrt); ein unärer Operator * aus einer Basisklasse<br />

wird durch Definition des binären Operators * in einer abgeleiteten Klasse verdeckt<br />

(oder umgekehrt).<br />

(11.36) Operator-Elementfunktionen (11.24) werden normal vererbt mit Ausnahme des Zuweisungsoperators.<br />

Wird das Standardverhalten dieses Operators (flache Kopie, s. (11.24b)) nicht<br />

gewünscht, muss er für jede Klasse überladen werden.<br />

11.4 Polymorphie<br />

(11.40) Übb Die Polymorphie vervollständigt das Konzept der Vererbung. Die Möglichkeit, Methoden<br />

in untergeordneten Klassen zu redefinieren, kommt dem menschlichen Denken sehr<br />

entgegen. Wir sind es gewohnt, Aktionen, die im Detail sehr unterschiedlich sein können,<br />

den gleichen Namen zu geben, wenn das Ergebnis ähnlich oder vergleichbar ist, wie z. B. die<br />

Aktion Schreiben oder Malen trotz unterschiedlicher Schreib- oder Malwerkzeuge mit sehr<br />

unterschiedlichen physikalisch-chemischen Einzelheiten. Die korrekte Aktion wird anhand<br />

des Objekttyps bestimmt (im Beispiel: des Werkzeugtyps).<br />

Dieses Konzept wird insbesondere im Zusammenhang mit der späten Bindung sehr mächtig<br />

und für die Praxis außerst wichtig. Es wird möglich, ” generischen“ Programmcode zu schreiben,<br />

dessen eigentliche Ausführung zur Kompilationszeit noch gar nicht feststeht. Hierdurch<br />

kann zur Laufzeit in Abhängigkeit vom (manchmal erst dann feststehenden) tatsächlichen<br />

Objekttyp die zugehörige Aktion ausgewählt werden.<br />

Punkt (11.41) beschreibt die Polymorphie näher, auch in Zusammenhang mit später Bindung.<br />

In (11.42) wird gezeigt, wie die späte Bindung in C ++ eingeführt wird. Abschließend beschreibt

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!