Vorlesungsskript - Hochschule Emden/Leer
Vorlesungsskript - Hochschule Emden/Leer
Vorlesungsskript - Hochschule Emden/Leer
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