Thread View: de.comp.lang.c++
13 messages
13 total messages
Started by Mario Paumann
Tue, 09 Jan 1996 16:30
virtueller Destruktor mit =0 ?
Author: Mario Paumann
Date: Tue, 09 Jan 1996 16:30
Date: Tue, 09 Jan 1996 16:30
14 lines
527 bytes
527 bytes
Hallo!
Kann mir einer sagen warum das nicht
moeglich sein sollte ?
class mein {
...
public:
...
virtual ~mein()=0;
...
};
Danke, mario
Re: virtueller Destruktor mit =0 ?
Author: Markus Becker
Date: Tue, 09 Jan 1996 12:55
Date: Tue, 09 Jan 1996 12:55
30 lines
1207 bytes
1207 bytes
pauman@apars1.apa.co.at (Mario Paumann) wrote:
>Hallo!
>
>Kann mir einer sagen warum das nicht
>moeglich sein sollte ?
>
>class mein {
> ...
> public:
> ...
> virtual ~mein()=0;
> ...
>};
>
>Danke, mario
Vielleicht steht's so in der Spezifikation?
Wo genau liegt denn das Problem? Beim compilieren der
Klasse, dadurch, dass keine abgeleitete Klasse existiert,
die den Destruktor definiert (dann hast Du eine pure
virtual class, die kann nicht aufgerufen werden).
--
Markus Becker http://www.zess.uni-siegen.de/private/becker/
Zentrum fuer Sensorsysteme (ZESS)
http://www.zess.uni-siegen.de/private/becker/win95
Re: virtueller Destruktor mit =0 ?
Author: Joern Sierwald
Date: Tue, 09 Jan 1996 13:56
Date: Tue, 09 Jan 1996 13:56
37 lines
1397 bytes
1397 bytes
Mario Paumann wrote:
>
> Hallo!
>
> Kann mir einer sagen warum das nicht
> moeglich sein sollte ?
>
> class mein {
> ...
> public:
> ...
> virtual ~mein()=0;
> ...
> };
>
> Danke, mario
Alles was als =0 declariert wird, muss in der erbenden Klasse
ueberschrieben werden. Das geht bei Con/Destructoren natuerlich
nicht. Denn die werden ja nicht ueberschrieben, sondern als
Stack aufgerufen. Also, wenn ich noch
class mein2 : mein
und
class mein3 : mein2
habe,
werden beim erschaffen von einem mein3 Object die
Constructoren von mein, mein2 und mein3 hintereinander aufgerufen.
Beim ende der Lebenszeit werden die destructoren von mein3, mein2
und mein aufgerufen. Ohne wenn und aber. In diesem Konzept
ist kein Platz fuer abstracte destructoren.
Joern
PS: Was soll das eingentlich?
Re: virtueller Destruktor mit =0 ?
Author: Enno Sandner
Date: Tue, 09 Jan 1996 14:06
Date: Tue, 09 Jan 1996 14:06
36 lines
1479 bytes
1479 bytes
Mario Paumann wrote:
>
> Hallo!
>
> Kann mir einer sagen warum das nicht
> moeglich sein sollte ?
>
> class mein {
> ...
> public:
> ...
> virtual ~mein()=0;
> ...
> };
>
Wird eine Instanz einer Klasse entfernt, werden u.a. die Destruktoren
aller Basisklassen aufgerufen. Das obige Bsp. allein duerfte keine
Probleme bereiten, im Gegensatz zu:
struct mein { virtual ~mein()=0; };
struct dein : mein {};
int main() { dein d; return 0; }
Das Entfernen von 'd' kann hier nicht funktionieren, da der Destruktur
in 'mein' als pure-virtual deklariert ist _und_ keine Implementierung
vorliegt. Aendert man das Programm zu:
struct mein { virtual ~mein()=0; }
mein :: ~mein() {}
struct dein : mein {};
int main() { dein d; return 0; }
funktioniert es, da nun eine Implementierung des Destruktors vorliegt.
Enno
Re: virtueller Destruktor mit =0 ?
Author: Watson
Date: Tue, 09 Jan 1996 15:16
Date: Tue, 09 Jan 1996 15:16
19 lines
896 bytes
896 bytes
Mario Paumann wrote:
> Kann mir einer sagen warum das nicht
> moeglich sein sollte ?
>
> class mein {
> ...
> public:
> ...
> virtual ~mein()=0;
> ...
> };
Und: wozu soll das denn gut sein?
--
* Greetinx,
Watson (sayegh@fokus.gmd.de)
more personal details at:
http://www.fokus.gmd.de/ovma/employees/sayegh/entry.html
Re: virtueller Destruktor mit =0 ?
Author: Bernd Eggink
Date: Tue, 09 Jan 1996 15:30
Date: Tue, 09 Jan 1996 15:30
35 lines
1335 bytes
1335 bytes
Mario Paumann (pauman@apars1.apa.co.at) wrote:
> Hallo!
> Kann mir einer sagen warum das nicht
> moeglich sein sollte ?
> class mein {
> ...
> public:
> ...
> virtual ~mein()=0;
> ...
> };
> Danke, mario
Es ist durchaus moeglich. Allerdings muss trotzdem noch die Funktion
'mein::~mein()' definiert werden, z.B.
mein::~mein() { }
Grund: Auch wenn der Destruktor einer von 'mein' abgeleiteten Klasse aufgerufen
wird, ruft dieser anschliessend den Destruktor von 'mein' auf. 'mein::~mein()'
muss also in jedem Fall definiert sein. Virtuelle Destruktoren unterscheiden
sich insofern von allen anderen virtuellen Funktionen.
Gruss
Bernd
--
+----------------------------------+
| Bernd Eggink |
| Rechenzentrum Uni Hamburg |
| admin@rzaix13.rrz.uni-hamburg.de |
+----------------------------------+
Re: virtueller Destruktor mit =0 ?
Author: 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
Re: virtueller Destruktor mit =0 ?
Author: Mario Paumann
Date: Tue, 09 Jan 1996 22:21
Date: Tue, 09 Jan 1996 22:21
55 lines
2737 bytes
2737 bytes
Ok. Ich versuchs nochmal genauer zu erklaeren :
1. Es ist klar das diese Klasse (mein) eine abstrakte
Klasse ist dies ist gewollt und hier lag auch nicht
der Fehler (z.Hd. Markus Becker)
2. Bei Klassen die über Pointer der abstrakten Basisklasse
deleted werden, sollte nicht der Destruktor der Basis-
klasse sondern der von der abgeleiteten Klasse (hierzu
sind ja die virtuellen Destruktoren eingefuert worden)
aufgerufen werden (z.Hd. Joern Sierwald)
3. z.Hd. Enno Sandner : Du hast es erfasst :
> 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)
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.
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;
}
Danke, mario
Re: virtueller Destruktor mit =0 ?
Author: Joern Sierwald
Date: Thu, 11 Jan 1996 12:59
Date: Thu, 11 Jan 1996 12:59
30 lines
1205 bytes
1205 bytes
Joern Sierwald wrote:
>
> Mario Paumann wrote:
> >
> > Hallo!
> >
> > Kann mir einer sagen warum das nicht
> > moeglich sein sollte ?
> >
> > class mein {
> > ...
> > public:
> > ...
> > virtual ~mein()=0;
> > ...
> > };
Ich habe es gerade mal mit meinem Lieblingscompiler (*) uebersetzt.
Er schluckt es. Dann noch ne abgeleitete Klasse dazu und ein
main() program -> link error: ~mein() not found.
Also mein::~mein() {}; dazu -> laeuft.
Sehr seltsam und ueberhaupt nicht das, was ich erwartet haette.
Aber man lernt ja dazu...
Joern
(*) TopSpeed C++ for DOS 3.01
Re: virtueller Destruktor mit =0 ?
Author: Claus Faerber
Date: Thu, 11 Jan 1996 18:45
Date: Thu, 11 Jan 1996 18:45
56 lines
2106 bytes
2106 bytes
Mario Paumann <pauman@apars1.apa.co.at> schrieb zu
Re: virtueller Destruktor mit =0 ?
in Artikel <4cu4it$675@news.Austria.EU.net> vom 09.01.96:
> 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;
> }
Microsoft Visual C++ V1.0:
---schnipp--------------------------------------------------------
Compiling...
c:\tmp\test.cpp
Linking...
TEST.OBJ(c:\tmp\test.cpp) : error L2029: 'public: virtual
__far __pascal mein::~mein(void)__near' : unresolved external
LINK returned error code 2.
Creating browser database...
TEST.EXE - 1 error(s), 0 warning(s)
---schnapp--------------------------------------------------------
Turbo C++ V1.0
---schnipp--------------------------------------------------------
===Message===
Compiling C:\TMP\EST.CPP:
Linking C:\SPRACHEN\TC\BIN\EST.EXE:
Linker Error: Undefined symbol mein::~mein() in module \TMP\EST.CPP
---schnapp--------------------------------------------------------
Ziemlich klar: dem Compiler ist's egal, aber der Linker findet den
Funktionsrumpf von mein::~mein (der ja nicht existiert) nicht,
wenn ihn der Destruktor von dein::~dein aufrufen will...
> Danke, mario
Bitte, gern geschehen.
Claus
------------------------------------------------------------------------
Claus Andre Faerber - claus@faerber.muc.de - http://www.muc.de/~cfaerber
>>> Windows - best before 95 <<<
------------------------------------------------------------------------
Re: virtueller Destruktor mit =0 ?
Author: Nico Josuttis
Date: Fri, 12 Jan 1996 09:56
Date: Fri, 12 Jan 1996 09:56
36 lines
1818 bytes
1818 bytes
In article <4cu4it$675@news.austria.eu.net>, Mario Paumann <pauman@apars1.apa.co.at> wrote: >Ok. Ich versuchs nochmal genauer zu erklaeren : > >... >2. Bei Klassen die über Pointer der abstrakten Basisklasse > deleted werden, sollte nicht der Destruktor der Basis- > klasse sondern der von der abgeleiteten Klasse (hierzu > sind ja die virtuellen Destruktoren eingefuert worden) > aufgerufen werden (z.Hd. Joern Sierwald) OHA, vielleicht liegt hier das Missverstaendnis !!! Bei Zerstoeren werden ALLE Destruktoren einer Hierarchie verkettet bottom-up aufgerufen. Insofern macht es absolut keinen Sinn, die Implementierung einer abgeleiteten Klasse zu ueberlassen. Deshalb ist immer einfach nur ein leerer virtueller Destruktor zu implementieren. Mich irritiert allerdings voellig, dass in einigen Antworten angedeutet wird, eine irgendwie geartete Definition mit "=0" koennte moeglich sein. Ich halte das fuer falsch, habe es aber nicht anhand vom Standard nachgeprueft. >Spezifikation hin oder her, theoretisch muesste sowas >ohne Probleme moeglich sein odrrr? Wenn jemand sagt, dass es theoretisch moeglich sei, ist es praktisch unmoeglich. Tschau -- Nico address: BREDEX GmbH, Nicolai Josuttis email: nico@bredex.de Fallersleber-Tor-Wall 23 phone: +49 531 24330-0 D-38100 Braunschweig fax: +49 531 24330-99 Germany
Re: virtueller Destruktor mit =0 ?
Author: Enno Sandner
Date: Fri, 12 Jan 1996 12:32
Date: Fri, 12 Jan 1996 12:32
59 lines
2631 bytes
2631 bytes
Nico Josuttis wrote:
>
> ...
>
> Mich irritiert allerdings voellig, dass in einigen Antworten
> angedeutet wird, eine irgendwie geartete Definition mit "=0"
> koennte moeglich sein.
> Ich halte das fuer falsch, habe es aber nicht anhand vom Standard
> nachgeprueft.
>
Fuer den pure-virtual Destruktor steht das unter 12.4 [class.dtor]
des DWP:
6 ... A destructor can be declared virtual (_class.virtual_) or
pure virtual (_class.abstract_); if any objects of that class or
any derived class are created in the program, the destructor
shall be defined. ...
Fuer Member-Functions liefert 10.3 [class.virtual] die Rechtfertigung:
8 A virtual function declared in a class shall be defined, or declared
pure (_class.abstract_) in that class, or both; but no diagnostic is
required (_basic.def.odr_).
Ueber den Sinn eines solchen Features laesst sich sicherlich streiten.
Man koennte es z.B. dazu verwenden, um Teilen der von Funktionen in
einem Interface ein 'Default-Verhalten' zuzuordnen:
lib.H:
struct AnyItf {
virtual void some_func()=0;
};
inline void AnyItf :: some_func() { /* Default-Verhalten */ }
client.C:
#include "lib.H"
struct SomeImpl : AnyItf {
void some_func() {
AnyItf :: some_func();
/* Zusaetzliche Funktionalitaet */
}
};
...
Dabei sei 'lib.H' das Headerfile einer Bibliothek und 'client.C' ein
Nutzer dieser Bibliothek. Der springende Punkt dabei ist, dass die
Definition des Default-Verhaltens, ins Headerfile gehoert (zumindest
deren Deklaration). Ansonsten koennte der Benutzer nicht ahnen, dass
eine Implementierung fuer 'some_func' angeboten wird.
(Eine alternative Lsg. zum obigen Szenario waere es, 'some_func' nicht als
pure zu deklarieren und irgendeine Dummy (pure-virtual) Funktion einzufuehren,
die dann garantiert, dass die Klasse abstrakt ist.)
Unter diesen Rahmenbedingungen laesst sich dieses Feature vielleicht
vernuenftig einsetzen.
Enno
Re: virtueller Destruktor mit =0 ?
Author: Schobi (s550796)
Date: Wed, 17 Jan 1996 17:59
Date: Wed, 17 Jan 1996 17:59
23 lines
1535 bytes
1535 bytes
Mario Paumann (pauman@apars1.apa.co.at) wrote:
: Ok. Ich versuchs nochmal genauer zu erklaeren :
: 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.
: 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.
Das Problem ist allerdings, dasz Destruktoren IMMER vorhanden sein mueszen.
Immer heiszt, deklarierst und definierst Du keinen (was -- zumindest bei
BC++ -- durchaus moeglich ist), dann fuegt der Compiler einen ,,versteckten``
hinzu.
Dies ist fuer C++ einfach hinzunehmen. Gruende magst Du vielleicht in
Stroustrups ,,Design and Evolution of C++`` finden.
Schobi
--
"Zehn Deutsche sind natuerlich duemmer als fuenf Deutsche." H.M.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads