Next: Typanpassung
Up: Klassen-Hierarchien und Vererbung
Previous: Zugriff auf Basisklassen
Wird ein Objekt einer abgeleiteten Klasse erzeugt, wird implizit
auch (je) eines der Basisklasse(n) kreiert
der Konstruktor der Basisklasse muß
aufgerufen werden.
class uhr
{ int std;
int min;
public:
uhr(int s, int m) : std(s), min(m) {};
uhr() : std(0), min(0) {};
void show() { cout << std << ':' << min;}
};
class wecker : public uhr
{ int alarm_std;
int alarm_min;
public:
wecker() : alarm_std(0), alarm_min(0) {}
wecker(int s, int m, int as, int am)
: uhr(s,m),
alarm_std(as),
alarm_min(am) {}
void show() { uhr::show();
cout << " || "
<< alarm_std << ':'
<< alarm_min;
}
};
Reihenfolge der Konstruktion
- Konstruktion des Basisklassenobjektes
- Konstruktion der Member
- Konstruktion des Objektes
Die Reihenfolge der Konstruktoraufrufe für Basisklassen bzw.
Elemente bestimmt sich aus der Reihenfolge der Deklaration
(nicht aus der Anordnung der Liste)!
Reihenfolge der Destruktion
umgekehrt
Nicht erlaubt sind
- Konstruktoraufrufe für indirekte Basisklassen
(außer bei virtuellen Basisklassen, siehe 8.7.1).
- Initialisierungen für geerbte Member.
Eine Klasse kann sowohl Basisklasse als auch Elementklasse sein:
// Besserer Wecker
class wecker : public uhr
{ uhr alarmzeit;
public:
wecker() : alarmzeit(0,0) {}
wecker(int s, int m, int as, int am)
: uhr(s,m),
alarmzeit(as,am) {}
void show() { uhr::show();
cout << " || ";
alarmzeit.show();
}
};
Wird ein Objekt einer abgeleiteten Klasse durch Kopie initialisiert
wecker w1(11,30,7,15);
wecker w2 = w1;
lassen sich vier Fälle unterscheiden:
- 1.
- Weder Basisklasse noch abgeleitete Klasse besitzt einen
Copy-Konstruktor:
- Basisklassenobjekt wird durch elementweise Kopie
(der relevanten Daten) initialisiert.
- Abgeleitetes Objekt wird durch elementweise Kopie initialisiert.
- 2.
- Die Basisklasse besitzt einen
Copy-Konstruktor, die abgeleitete Klasse nicht:
uhr(const uhr& ori) : std(ori.std),
min(ori.min) {}
- Basisklassenobjekt wird durch den Copy-Konstruktor initialisiert.
- Abgeleitetes Objekt durch elementweise Kopie.
- 3.
- Die abgeleitete Klasse besitzt einen
Copy-Konstruktor, die Basisklasse nicht:
wecker(const wecker & ori)
: uhr(ori),
alarmzeit(ori.alarmzeit) {}
- Basisklassenobjekt wird durch elementweise Kopie initialisiert.
Allerdings nicht automatisch, sondern explizit im Copy-Konstruktor
der abgeleiteten Klasse (Aufruf uhr(ori)). Fehlt der
Aufruf, wird nur der Default-Konstruktor der Basisklasse benutzt.
- Abgeleitetes Objekt wird durch den Copy-Konstruktor initialisiert.
- 4.
- Sowohl Basisklasse als auch abgeleitete Klasse besitzt einen
Copy-Konstruktor:
- Basisklassenobjekt wird durch Copy-Konstruktor initialisiert
(explizit aufzurufen).
- Abgeleitetes Objekt wird durch Copy-Konstruktor initialisiert.
Next: Typanpassung
Up: Klassen-Hierarchien und Vererbung
Previous: Zugriff auf Basisklassen
Peter Pfahler, 1997