Wie bekommen Basisklassen ihren initialen Werten?
Frage: Wie werden Konstruktoren und Destruktoren in Basisklassen aufgerufen?
In welcher Reihenfolge werden
Konstruktoren und Destruktoren in Basis- und abgeleiteten Klassen aufgerufen?
Antwort: Konstruktoren werden in der Reihenfolge der Ableitung
aufgerufen
Destruktoren in der umgekehrten Reihenfolge
Die Parameter für die Basisklasse müssen von dem Basisklasse-
Konstruktor weitergegeben werden Die Basisklasse muss vor der
abgeleiteten Klasse initialisiert werden
Die Basisklasse muss nach der abgeleiteten Klasse zerstört
werden
Erst wenn der Konstruktor der Basisklasse fertig ist wird der Konstruktor der abgeleiteten Klasse aufgerufen
Es können Abhängigkeiten zwischen Variablen der
Basisklasse und der abgeleiteten Klasse entstehen
Bei längeren Vererbungsketten gelten die gleichen Regeln
<abgel_Konstruktor>(<argListe1>) :
<Basisklasse>(<argListe2>){...}
student(i,j,s, l, t, b):
mensch(l, t, b) {
studentID = i;
semester = j;
matrikulationsdatum = s;
}
Bei public-Vererbung:
Eine abgeleitete Klasse wird per Default zum Basistyp umgewandelt (ohne Cast) Ein Zeiger auf eine abgeleitete Klasse wird per Default zum Zeiger auf die
Basisklasse umgewandelt (ohne Cast) Ein Zeiger auf eine Methode der
abgeleiteten Klasse wird per Default zum Zeiger der Methode in der Basisklasse umgewandelt (ohne Cast)
...
mensch *pMensch;
student *qStudent;
student einStudent;
mensch einMensch;
pMensch = &einMensch;
qStudent = &einMensch;
qStudent = &einStudent;
cout << qStudent->getAge() << endl;
...
Umgekehrt ist die
Typumwandlung, d.h. die
Zuweisung eines Zeigers auf eine Basisklasse mit einem Zeiger auf eine abgeleitete Klasse, nur mit einem Cast möglich
Diese Art Zuweisung kann gefährlich werden
mensch *pMensch = new student;
student *qStudent = (student *) pMensch;
qStudent->getStudentID();
ist korrekt, aber:
mensch *pMensch = new mensch;
student *qStudent = (student *) pMensch;
qStudent->getStudentID();
führt zum Programmabsturz!!
Müssen vom Programmierer geschrieben werden
Erfolgen durch Überladung des Cast-Operators
class student : public mensch{
...
public:
operator char *();
...
};
Syntax des Cast-Operators genau beachten!
Konstruktoren, Destruktoren und Zuweisungsoperatoren können nicht vererbt werden
"Casts are to C++ programmers what the apple was to Eve" (Scott Myers)