Vererbung
Vererbung (c) Steinbrecher Christian Diese Seite ist für 1024 x 768 optimiert
Inhaltsverzeichnis 1. Beispiel 2. Zugriffsrechte 3. Virtuelle Methoden 4. Zugriff auf Objekte einer Klasserhierarchie mittels Zeigern 5. Abstrakte Klassen 6.
Mehrfachvererbung
1. Beispiel: graphisches System für Punkte, Kreise, Linien, Kreisbögen
Klassendiagramm
Vereinbarung der abgeleiteten Klassen
Implementierung
zurück zum Inhaltsverzeichnis
2. Zugriffsrechte
- steuern die Zugriffs-Erlaubnis auf die Eigenschaften und Methoden einer Klasse.
private: nur die Methoden der eigenen Klasse können zugreifen,
protected: die eigenen Methoden und die Methoden der abgeleiteten Klassen dürfen zugreifen,
public: alle (auch die Methoden fremder Klassen und "normale" Funktionen) dürfen zugreifen.
- bei "braver" Datenkapselung: alle Eigenschaften private, einige (wenige) Methoden public
- Beispiel:
- Zugriffsrechte der geerbten Elemente können in der abgeleiteten Klasse eingeschränkt werden:
class Aklasse: public Bklasse (..
.); Zugriffsrechte der geerbten Elemente bleiben unverändert
class Aklasse: protected Bklasse (...); alle geerbten public-Elemente sind in Aklasse protected
class Aklasse: private Bklasse (..
.); alle geerbten public- und protected-Elemente sind in Aklasse private (Default!!!)
zurück zum Inhaltsverzeichnis
3. Virtuelle Methoden
"Frühe Bindung": beim Aufruf einer Element-Funktion wird die Sprung-Adresse bereits zum Übersetzungs-Zeitpunkt festgelegt.
Beispiel:
Vorteil: Speicherplatzsparend, schnell
Nachteil: Klasse Circle muss MoveTo neu definieren, obwohl "logisch" gleicher Ablauf
"Späte Bindung": beim Aufruf der Element-Funktionen wird die tatsächliche Sprungadresse erst zur Laufzeit
ermittelt (Compiler erzeugt einen "indirekten" Sprung über die sogenannte V-Table des Objekts).
Erreicht man in C++ mittels Schlüsselwort virtual.
Nachteil: mehr Speicherplatz, langsamer
Vorteil: Klasse Circle muss MoveTo nicht neu definieren, kann geerbte Funktion verwenden.
Beispiel:
Durch den Einsatz der späten Bindung wird "Polymorphie" (=Vielgestaltigkeit) sichergestellt: die gleiche
Methode ist je nach Objekt-Art unterschiedlich realisiert.
Wann muss eine Methode virtuell sein?
- wenn sie in den abgeleiteten Klassen unterschiedlich implementiert ist
- und * wenn Sie in einer anderen Methode der Basisklasse aufgerufen wird oder
* über einen Objekt-Zeiger vom Typ "Zeiger auf Basisklasse" aufgerufen wird
Bsp.: Point *tab [MAXANZ] = ... // speichert Zeiger auf Point-,
for (int i=0; i<anz; ++i) // Circle-, Arc- und Line-Objekte
tab[i]->Show ();
zurück zum Inhaltsverzeichnis
4.
Zugriff auf Objekte einer Klasserhierarchie mittels Zeigern
- Zeiger vom Typ "Zeiger auf Basisklasse" sind in gewissem Umfang kompatibel zu
Zeigern vom Typ "Zeiger auf abgeleitete Klasse"
- z.B.: Point *pp, p1(100,200);
Circle *cp, c1 (100,200,50);
pp = &c1;
pp->MoveTo(120,220);
// cout << pp->getRadius(); // nicht möglich, wenn getRadius Methode
// von Circle ist
cout << ((Circle*)pp)->getRadius();
// cp = &p1; // nicht erlaubt, da sonst Zugriffe auf
// nicht vorhandene Komponenten möglich
zurück zum Inhaltsverzeichnis
5. Abstrakte Klassen
- dient nur als Basisklasse für andere Klassen
- es können keine Objekte angelegt werden (allerdings Zeiger und Referenzen)
- enthält mindestens eine "abstrakte Funktion" (pure virtual function)
- abstrakte Funktion:
- virtuelle Funktion, für die in der Basisklasse keine Implementierung existiert
(da Implementierung nicht möglich oder nicht sinnvoll ist)
- z.B.: class APoint {
.
..
virtual void Show () = 0; // abstrakte Funktion
...
};
- in den abgeleiteten Klassen müssen die abstrakten Funktionen durch "konkrete" Funktionen ersetzt werden
zurück zum Inhaltsverzeichnis
6.
Mehrfachvererbung
Objekte können auch von mehreren anderen Objekten erben
Vereinbarung der mehrfach abgeleiteten Klassen
Implementierung
Das Problem bei der Mehrfachvererbung besteht darin, dass ein Objekt Eigenschaften auch mehrfach vererbt bekommen kann. zurück zum Inhaltsverzeichnis
Anmerkungen: |
| impressum | datenschutz
© Copyright Artikelpedia.com