Version [26631]
Dies ist eine alte Version von ObjProg06Vererbung erstellt von RonnyGertler am 2013-04-29 19:59:29.
Objektorientierte Programmierung - Kapitel 6 - Vererbung
Inhalte von Dr. E. Nadobnyh
6.1. Grundbegriffe
Vererbung, abgeleitete Klasse, Basisklasse
Die Vererbung ist ein effizienter Mechanismus, mit dem aus bereits existierenden Klassen neue Klassen gebildet werden können.
Die neue Klasse heißt abgeleitete Klasse (Unterklasse).
Die alte Klasse heißt Basisklasse (Oberklasse).
Jedes Objekt der abgeleiteten Klasse enthält ein anonymes Objekt der Basisklasse, welches als Teilobjekt (Subobjekt) bezeichnet wird.
Die abgeleitete Klasse kann zusätzliche Attribute und Methoden enthalten. Diese Möglichkeit wird als Abweichung (Erweiterung) bezeichnet.
class A
Beispiel in C
{ private: int x;
public: int ma();
};
class B :public A
{ private: int y;
public: int mb();
};
main()
{ B b1;
}
public: int ma();
};
class B :public A
{ private: int y;
public: int mb();
};
main()
{ B b1;
}
UML- Klassendiagramm
Zugriff auf Teilobjekt der Basisklasse
public- Vererbung
Bei der public- Vererbung steht die abgeleitete Klasse zur Basisklasse in einer Ist-Beziehung.
Ein Objekt b1 der abgeleitete Klasse B ist auch ein (spezielles) Objekt der Basisklasse A, weil b1 alle Methoden der Basisklasse A automatisch besitzt und sich so wie ein Objekt der Basisklasse A verhält.
Schnittstelle abgeleiteter Klasse
Die Deklarationen von allen public- Methoden bilden die öffentliche Schnittstelle (Interface). Durch diese Methoden kommuniziert ein Objekt mit der Umgebung.
Die öffentliche Schnittstelle der abgeleiteten Klasse besteht aus:
1) der öffentlichen Schnittstelle der Basisklasse und
2) den in der abgeleiteten Klasse zusätzlich deklarierten public-Methoden (und public- Attributen).
Vererbung der Schnittstelle
Die Schnittstelle der Basisklasse wird geerbt, wenn die öffentliche Methoden der Basisklasse durch Objekte der abgeleiteten Klasse aufgerufen werden dürfen.
Vererbung der Implementierung
Die Implementierung der Basisklasse wird geerbt, wenn öffentliche Methoden der Basisklasse zwar innerhalb der abgeleiteten Klasse aufgerufen werden dürfen. Der Code der Basisklasse wird dabei wiederverwendet.
Varianten der Vererbung
1) Öffentliche Vererbung
Vererbung von Schnittstelle und Implementierung.
class A{ };
class B :public A { };
class B :public A { };
Reine Vererbung derImplementierung.
class A{ };
class B :private A { };
class B :private A { };
Eine Klasse erbt von einer anderen Klasse.
class A{ };
class B :public A { };
class B :public A { };
4) Mehrfachvererbung
Eine Klasse erbt von mehreren Klassen.
class A{ }; class B{ };
class C :public A, public B { };
class C :public A, public B { };
Klassenhierarchie ist ein Satz von verwandten Klassen.
Beispiel:
class A{ };
class B :public A { };
class C :public A { };
a) Die Basisklasse ist eine Generalisierung der abgeleiteten Klassen.
b) In der Klassenhierarchie bedeutet das die Richtung nach oben.
Spezialisierung (Konkretisierung) ist die Entwicklung der abgeleiteten Klasse durch die Ergänzung der Basisklasse mit der zusätzlichen Eigenschaften und Verhaltensweisen.
a) Die abgeleitete Klasse ist eine Spezialisierung der Basisklasse.
b) In der Klassenhierarchie bedeutet das die Richtung nach unten.
⇒ Demo 1
Vorteile der Vererbung
1) Datenabstraktion
Allgemeine Eigenschaften und Vorgänge können mit Oberbegriffen versehen werden (Basisklassen).
Komplexe Sachverhalte werden dadurch einfacher darstellbar. Einige Klassen sind sehr kompliziert aufgebaut, besitzen aber eine einfache Schnittstelle.
2) Wiederverwendbarkeit
Bereits erstellte und ausgetestete Klassen können weiterhin verwendet und an neue Anforderungen angepasst werden. Dazu braucht nicht die Implementierung der Basisklasse, sondern nur ihre öffentliche Schnittstelle bekannt zu sein.
6.2. Einfache Vererbung
Aufbau des Objektes abgeleiteter Klasse
Alle Konstruktoren einer abgeleiteten Klasse müssen neu definiert werden. Sonst existieren nur Standard-Konstruktoren.
Bei der Initialisierung eines Objektes, welches Teilobjekt der Basisklasse enthält, sind mehrere Konstruktoren auszuführen.
Reihenfolge der Konstruktor- Aufrufe:
1) Konstruktor der Basisklasse. Ohne weitere Angabenwird der Default- Konstruktor aufgerufen.
2) Konstruktoren für alle Attribute-Objekte.
3) Konstruktor der abgeleiteten Klasse.
Aufbau des Teilobjektes
Der Aufruf von Default-Konstruktoren beim Aufbau von Teilobjekten hat folgende Nachteile:
1) Ein Teilobjekt der Basisklasse wird zwei mal mit Werten versehen:
a) zuerst durch den Aufruf des Default-Konstruktors der Basisklasse,
b) danach durch die Zuweisung beim Aufruf des Konstruktors der abgeleiteten Klasse. Diese doppelte Aktion beeinträchtigt die Ausführungszeit.
2) Die private- Attribute der Basisklasse werden durch Aufrufe der entsprechenden Zugriffsmethoden mit richtigen Anfangswerten versehen.
3) Konstante Objekte können nicht durch die Zuweisung mit Werten versehen werden.
4) Eine Klasse ohne Default-Konstruktor kann nicht als Basisklasse verwendet werden.
Zugriffsmethoden
Zugriffsmethoden gewährleisten den kontrollierten Zugriff auf die geschützten Attribute des Objektes.
class A {
private: int zet;
public: void setZet(int z) { //eventuelle Kontrolle
zet = z;
}
};
main () {
A a1;
a1.zet = 5; //Fehler
a1.setZet(5); //OK
}
private: int zet;
public: void setZet(int z) { //eventuelle Kontrolle
zet = z;
}
};
main () {
A a1;
a1.zet = 5; //Fehler
a1.setZet(5); //OK
}
Basisinitialisierer
Ein Basisinitialisierer dient für den Aufruf eines Konstruktors der Basisklasse und wird in der Initialisierungsliste angegeben.
⇒ Demo 3
⇒ Demo 4
CategoryObjProg