Virtual Destructor

DuffCola

Mitglied
Hallo.
Ich habe mir gerade mal die virtual methoden angeshene, wobei dabei eigentlch alles verstanden habe.
Jetzt verstehe ich bei virtullen destruktoren aber etwas nicht wirklich.
Aber zuerst mal der Code:

Code:
class BasisKlasse
{
public:
	virtual void function(void)
	{
		cout<<"1"<<endl;
	}
	BasisKlasse()
	{
		cout<<"Konstruktor BasisKlasse"<<endl;
	}
	virtual ~BasisKlasse()
	{
		cout<<"Destruktor BasisKlasse"<<endl;
	}
};
Code:
class AbgeleiteteKlasse : public BasisKlasse
{
public:
	virtual void function(void)
	{
		cout<<"2"<<endl;
	}
	AbgeleiteteKlasse()
	{
		cout<<"Konstruktor AbgeleiteteKlasse"<<endl;
	}
	virtual ~AbgeleiteteKlasse()
	{
		cout<<"Destruktor AbgeleiteteKlasse"<<endl;
	}
};
Code:
int main(void)
{
	BasisKlasse *b = new AbgeleiteteKlasse();
	b->function();
	_getch();
	delete b;
	_getch();
	return 0;
}

So, normalerweise, wenn ich das "virtual" in der Basisklasse am "Destructor" entferne, wird beim löschen nur der "Destruktor" von der Basisklasse ausgeführt.(Ist ja auch logsich)
Wenn ich den "Destructor" "virtual" mache wird auch der "Destructor" von der Abgeleiteten Klasse ausgeführt.
Und dass wundert mich, da ich ja den "Destructor" ja in der abgeleitet Klasse komplett überschrieben werden sollte, aber hier wird
das ja einfach nur "drangehangen".

Wenn ich das selbe nämlichen mit functionen mache, wird die function in der abgeleiteten klasse a komplett überschireben, in dem beispielfunction im obrigen code wird z.B. ja dann nur 2 ausgeben.

Kann mir jemand sagen, warum sich ein virtual Destructor anders verhält, als eine virtual Methode?
 
Hallo duffcola

Du musst hier zwei Sachen auseinander halten:
1. Virtuelle Funktion
2. Destruktor

Zum Thema Destruktor sagt dir der Standard folgendes:
After executing the body of the destructor and destroying any automatic objects allocated within the body, a destructor for class X calls the destructors for X’s direct members, the destructors for X’s direct base classes and, if X is the type of the most derived class (12.6.2), its destructor calls the destructors for X’s virtual base classes

Mit anderen Worten:
Zuerst wird der Destruktorcode ausgeführt, dann der Destruktor aller Member der Klasse, dann der der Basisklasse.

Zum Thema virtuelle Funktion:
Durch das Virtualisieren des Destruktors der Basisklasse sorgst du dafür, dass der Destruktor der Kindklasse aufgerufen wird, sofern der vorhanden ist, auch wenn du ein Objekt vom Typ der Basisklasse löscht.

Wenn wir das nun kombinieren erhalten wir folgendes:
C++:
	Bar* bar = new Bar();
	Foo* foo = static_cast<Foo*>(bar);
	delete foo;

delete foo möchte den Destruktor aufrufen, da dieser virtuell ist wird der Destruktor von Bar aufgerufen, das wäre der Punkt zu den virtuellen Funktionen.

Der Destruktor von Bar ist nun fertig muss aber gemäss Standard nun den Destruktor von Foo auch noch aufrufen und tut das entsprechend. Das wäre Punkt 1

Viele Grüsse
Cromon
 
Zurück