Also a) ja der Oberklassen Konstruktor wird standardmäßig aufgerufen, war mir neu, aber gut zu wissen. Das gilt allerdings auch nur dann, wenn ein Default Konstruktor ohne Parameter vorhanden ist.
aber b) in folgendem Beispiel wird erst der Unterklassen Destruktor aufgerufen und dann der Oberklassen Destruktor!
Code: Alles auswählen
#ifndef UNTERKLASSE_H_
#define UNTERKLASSE_H_
#include "Oberklasse.h"
class Unterklasse : public Oberklasse
{
public:
Unterklasse() {std::cout << "Unterklassen Constructor" << std::endl;}
~Unterklasse() {std::cout << "Unterklassen Destructor" << std::endl;}
};
#endif
Code: Alles auswählen
#ifndef OBERKLASSE_H_
#define OBERKLASSE_H_
#include <iostream>
class Oberklasse
{
public:
Oberklasse() { std::cout << "Oberklassen Constructor" << std::endl; }
virtual ~Oberklasse() { std::cout << "Oberklassen Destructor " << std::endl; }
};
#endif
Code: Alles auswählen
#include "Oberklasse.h"
#include "Unterklasse.h"
int main(int argc, char** argv)
{
Unterklasse* klasse = new Unterklasse();
delete klasse;
}
Und wie ich bereits geschreiben habe, wenn man die Variable
klasse vom Typ Oberklasse macht und den Destructor von Oberklasse nicht virtual, dann wird der Destructor der Unterklasse nicht aufgerufen
Und demnach wird soweit ich weiß auch der Destruktor von unten nach oben und nicht von oben nach unten aufgerufen.
Na dann viel Spass... überleg dir mal wie das gehen soll.
Hab ich mir überlegt! Und bin dabei zu folgendem Schluss gekommen: Angenommen im Oberklassen Destruktor wird etwas gelöscht, auf das der Unterklassen Destruktor noch zugreift, dann würde das in deiner Variante zu einem Crash führen... wäre also nicht sinnvoll oder?