2 Fragen zu abstrakten Klassen in C++ und Konstruktor/Destruktor
-
Hi!
Ich bastele gerade ein wenig mit virtuellen / abstrakten Klassen in C++ herum und habe mich da folgendes gefragt:
- Kann eine Klasse mit einer oder mehreren 'pure virtual' Funktionen einen Konstruktor haben, sodass man die abstrakte Klasse beim Überschreiben dennoch immer definierte Werte in den Variablen / Attributen haben kann? Oder muss dann jede neue Klasse, die die abstrakte Klasse überschreibt selbst dafür sorgen?
Also wenn das geht, dann wüsste ich momentan nicht wie. gcc schmeißt mir hier bei jeder Variante nur Fehler..- Kann man entsprechend einer abstrakten Klasse (egal ob pure virtual oder nicht) einen nicht virtuellen Destruktor geben, um genau die aus (1) gesetzten Variablen wieder ordentlich freizugeben?
Gruß
Pille
-
Dies ist eigentlich eine reine C++ Frage, keine CLI-spezifische.
Jede Klasse (egal ob abstrakt oder nicht) kann beliebig viele Konstruktoren haben, d.h. auch schon entsprechende Member. Abstrakt bedeutet ja nur, daß eine (oder mehrere) virtuelle Methoden noch nicht implementiert sind, d.h. von der abgeleiteten Klasse dann implementiert werden müssen.
Üblicherweise werden abstrakte Klassen aber als Schnittstellen-Klassen (Interfaces) definiert, so daß sie nur aus (pure) virtuellen Methoden bestehen.Und zu deiner zweiten Frage:
Jede Klasse, die vererbbar sein soll (d.h. abstrakte Klassen per se) sollte (muß) einen virtuellen Destruktor besitzen und auch definieren (wenn auch leer)!
Und dieser sollte selbstverständlich entsprechend dem Konstruktor alle Ressourcen wieder freigeben. Durch konsequente Verwendung von RAII ist dies jedoch unnötig (und RAII-Klassen wiederum sind als reine Wrapper-Klassen meistens nicht zur Vererbung gedacht).
-
Die abstrakte Klasse kann ohne weiteres auch einen nicht-virtuellen Destruktor haben.
Die Objekte dürfen dann bloss nicht über einen Basisklassen-Zeiger gelöscht werden.Es gelten halt die gleichen Regeln wie sonst für virtuelle Destruktoren, dass eine Klasse abstrakt ist ändert daran nichts.