Vorlesungsskript - Hochschule Emden/Leer
Vorlesungsskript - Hochschule Emden/Leer
Vorlesungsskript - Hochschule Emden/Leer
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
c○ Prof. Dr. B. Bartning, HS <strong>Emden</strong>/<strong>Leer</strong> Rumpfskript ” Informatik I/II“ (WS/SS 2010/11) 129<br />
Punkt (11.43), wie in C ++ abstrakte Klassen erzeugt werden (d. h. Klassen, die nur für die<br />
Klassenhierarchie von Bedeutung sind, da sie selbst keine Objekte haben können).<br />
(11.41) Die Polymorphie (dt. ” Vielgestaltigkeit“) oder der Polymorphismus ist in der Informatik<br />
ein sehr schillernder Begriff. Es wird je nach Autor Unterschiedliches darunter verstanden.<br />
Allgemein bedeutet die Polymorphie, dass verschiedenen Aktionen die gleichen Namen gegeben<br />
werden können; die Bindung des Namens an die tatsächlich auszuführende Aktion<br />
hängt vom Zusammenhang (Kontext) ab.<br />
(11.42)<br />
Ein sehr einfacher Fall der Polymorphie in C ++ wäre schon die Überladungsmöglichkeit<br />
von Funktionsnamen: je nach Kontext (Signatur des Aufrufs) wird die tatsächliche Aktion<br />
ausgewählt.<br />
Häufiger wird unter Polymorphie die Möglichkeit verstanden, dass Methoden verschiedener<br />
Klassen denselben Namen für ihre – unterschiedlichen – Aktionen vergeben dürfen (diese<br />
Aktionen sollten aber aus Übersichtlichkeitsgründen ähnliche Bedeutung haben). Innerhalb<br />
einer Ableitungshierarchie besteht die Möglichkeit, Funktionen der Basisklasse zu redefinieren,<br />
beispielsweise wenn eine bestimmte Aktion für Objekte der abgeleiteten Klassen<br />
(zumindest teilweise) anders durchzuführen ist.<br />
Insbesondere ist dieses Mittel in Zusammenhang mit der späten Bindung (oder dynamischen<br />
Bindung) 〈late binding, dynamic binding〉 sehr ausdrucksstark: hierbei findet die<br />
Bindung des Namens an die tatsächlich durchzuführende Aktion erst zur Laufzeit statt. Bei<br />
einer frühen Bindung (oder statischen Bindung) 〈early binding, static binding〉 wird<br />
die Bindung bereits durch den Compiler oder Linker festgelegt.<br />
Bei getypten Sprachen (z. B. C ++) ist aus Gründen der Fehlerminimierung Polymorphie mit<br />
später Bindung nur innerhalb einer Klassen-Ableitungshierarchie erlaubt; andere Sprachen<br />
erlauben sie beliebig (z. B. Smalltalk).<br />
Bsp Die Aktion schreibe(Buchstabe) ist je nach Schreibmittel sehr verschieden: beim Bleistift Abrieb von<br />
Graphit, beim Kugelschreiber Abrollen einer Kugel mit Farbe, beim Filzstift Wirkung von Kapillarkräften<br />
auf farbige Flüssigkeit usf. Die Aktion bleistift.schreibe(’B’) kann schon frühzeitig an das Graphitabreiben<br />
gebunden werden, der Befehl schreibstift.schreibe(’B’) kann jedoch erst dann an eine<br />
spezielle Aktion gebunden werden, wenn entschieden ist – ggf. erst zur Laufzeit –, welcher Art der Schreibstift<br />
ist.<br />
(a) Bei getypten Sprachen steht der Speicherplatzbedarf für das Erzeugen eines (einzelnen) Objekts<br />
schon zur Kompilationszeit fest; bei der Erzeugung ist immer der richtige Konstuktor<br />
bekannt. Werden dann die Aktionen (Elementfunktionen) mit dem zugehörigen Objektnamen<br />
aufgerufen, kann schon der Compiler entscheiden, welche Aktion stattfindet ( ” frühe<br />
Bindung“).<br />
(b) In C ++ ist es erlaubt, einem Zeiger einer Basisklasse die Adresse eines Objekts einer abgeleiteten<br />
Klasse zuzuweisen – entsprechend auch bei einer Referenz.<br />
Fortsetzung Beispiel aus (11.35):<br />
Basis *zeigBasis;<br />
Ableitung abl;<br />
zeigBasis=&abl; // erlaubt<br />
Basis &refBasis=abl; // ebenfalls erlaubt<br />
Hierbei ist unbedingt zu unterscheiden:<br />
• der statische Typ des Zeigers bzw. der Referenz<br />
(angegebenes Beispiel: zeigBasis/refBasis sind Zeiger/Referenz auf Basis)<br />
• und der dynamische Typ<br />
(angegebenes Beispiel: zeigBasis/refBasis sind Zeiger/Referenz auf Ableitung);<br />
dieser dynamische Typ steht letzlich erst zur Laufzeit fest.<br />
In diesem Fall ist es wichtig, wann die Bindung an eine Aktion geschieht:<br />
Welche Aktion wird beim Aufruf<br />
zeigBasis->aktion() bzw. refBasis.aktion()<br />
durchgeführt: Basis::aktion() oder Ableitung::aktion()?