Article View: de.comp.lang.c++
Article #1214Re: virtueller Destruktor mit =0 ?
From: Enno Sandner
Date: Tue, 09 Jan 1996 20:54
Date: Tue, 09 Jan 1996 20:54
68 lines
3738 bytes
3738 bytes
In article <4cu4it$675@news.Austria.EU.net> pauman@apars1.apa.co.at (Mario Paumann) writes:
...
> aller Basisklassen aufgerufen. Das obige Bsp. allein duerfte keine
> Probleme bereiten, im Gegensatz zu:
Das hab ich auch geglaubt, aber mein HPUX C++ Compiler
gibt mir dieses Warning
- CC: "TripService.h", line 38: warning: please provide an out-of-line
- definition: mein::~mein() {}; which is needed by
- derived classes (245)
Mit Problem meinte ich eine Fehlermeldung - keine Warnungen. Warnungen sind
Compiler-abhaengig, z.B. koennte ein Compiler 'unsauber eingerueckte'
Programme mit Warnungen versehen.
Allerdings scheinen sich die Entwickler des HPUX Compilers wirkliche Muehe
gegeben zu haben auch aussergewoehnlichere Faelle zu beruecksichtigen.
Pure-virtual Functions sind ja dazu entwickelt worden, dass
man keinen Funktionsrumpf schreiben muss der eigenltich nichts
enthaelt, deshalb hab ich immer geglaubt dasz man ENTWEDER =0 ohne
Funktionsrumpf ODER Funktionsrumpf ohne =0 angibt.
Pure-virtual functions (pvf) dienen neben Modellierungs-Aspekten dazu das
Erzeugen von Instanzen einer bestimmten Klasse zu unterbinden. Wenn die Klasse
eine pvf hat, kann man keine Instanzen von ihr erzeugen.
BTW man kann generell, also nicht nur fuer Destruktoren, Implementierungen
fuer pvf anbieten.
Aber es geht anscheinend auch beides. D.h. man kann (und
wie die Fehlermeldung von oben auch zeigt VERLANGT mein
CC-Compiler das sogar) einen Funktionsrumpf fΓΌr eine
pure-virtual Function definieren.
Ausserdem hab ich angenommen, daΓ pure virtuelle Destruktoren
nichts ausmachen, da eine Klasse ja nicht unbedingt einen
Destruktor braucht. Aber um (wie oben schon angerissen)
eine Objekt ueber einen Pointer vom Typ der (abstrakten!)
Basisklasse zu deleten, muss diese Funktion auch in der
Basisklasse definiert werden (und zwar als virual).
So. Fertiggelabbert :)
Spezifikation hin oder her, theoretisch muesste sowas
ohne Probleme moeglich sein odrrr?
Schreibt mir doch bitte mal die Reaktionen von eueren Compilern
zu diesem Codestueck (dieses sollte direkt compilierbar sein) :
#include <iostream.h>
struct mein { virtual ~mein()=0; };
struct dein:mein { virtual ~dein(); };
dein::~dein() { cout << "~dein" << endl; }
main()
{ dein d;
return 0;
}
Nein, das Bsp. Programm hat ebenfalls das Problem, dass der Destruktor von
'dein' den als pure-virtual deklarierten (+ nicht def.) Destruktor von 'mein'
aufrufen muesste. Das Programm sollte also nicht uebersetzbar sein.
g++ beschwert sich z.B. beim Linken, dass 'mein :: ~mein()' nicht vorhanden
ist. Mir ist kein portabler Weg bekannt, wie man den Aufruf der Basisklassen-
destruktoren unterdruecken koennte (mir war auch noch nie danach ... ;-).
Insofern muss der Destruktor von 'mein' definiert sein, falls von irgendwel-
chen Unterklassen von 'mein' Instanzen erzeugt werden sollen.
Enno
Technical Details
Message-ID:
<ENNO.96Jan9215404@kitz.inferenzsysteme.informatik.th-darmstadt.de>Path:
arc1-ca.pugleaf.net!news.th-darmstadt.de!news!ennoReferences:
<4ctg28$t5o@news.Austria.EU.net> <4cu4it$675@news.Austria.EU.net>Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!news.th-darmstadt.de!news!enno From: enno@inferenzsysteme.informatik.th-darmstadt.de (Enno Sandner) Newsgroups: de.comp.lang.c++ Subject: Re: virtueller Destruktor mit =0 ? Date: 09 Jan 1996 20:54:01 GMT Organization: Fachbereich Informatik, TH Darmstadt Distribution: world Message-ID: <ENNO.96Jan9215404@kitz.inferenzsysteme.informatik.th-darmstadt.de> References: <4ctg28$t5o@news.Austria.EU.net> <4cu4it$675@news.Austria.EU.net> NNTP-Posting-Host: kitz.intellektik.informatik.th-darmstadt.de In-reply-to: pauman@apars1.apa.co.at's message of Tue, 09 Jan 96 22:21:07 GMT