C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Wann macht man einen Destruktor virtuell?
Goto page 1, 2, 3  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Stephan Roth
Guest





PostPosted: Wed Apr 28, 2004 12:46 pm    Post subject: Wann macht man einen Destruktor virtuell? Reply with quote



Hallo Community,

in welchen Fällen macht man einen Destruktor virtuell? Wann ist es überhaupt
sinnvoll, einen nicht-virtuellen Destruktor zu deklarieren?

MfG
Stephan

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Benjamin Wrzecionko
Guest





PostPosted: Wed Apr 28, 2004 8:38 pm    Post subject: Re: Wann macht man einen Destruktor virtuell? Reply with quote



Hallo!

Stephan Roth schrieb am 28.04.2004 14:46:

Quote:
in welchen Fällen macht man einen Destruktor virtuell? Wann ist es überhaupt
sinnvoll, einen nicht-virtuellen Destruktor zu deklarieren?

Ich kenne es nur so, dass Destruktoren generell virtuell deklaraiert
werden. Das bietet den Vorteil, dass man Nachfahren korrekt löschen
kann, wenn man nur einen Zeiger auf den Vorfahren hat.
Der Nachfahrendestruktor ruft außerdem automatisch den
Vorfahrensdestruktor mit auf, um den durch Vorfahren belegten
Speicherplatz freizugeben.

Bis denn,
Ben

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
news
Guest





PostPosted: Wed Apr 28, 2004 8:59 pm    Post subject: Re: Wann macht man einen Destruktor virtuell? Reply with quote




Zuerst die Fakten:

Quote:
in welchen Fällen macht man einen Destruktor virtuell?

Klasse C braucht einen virtuellen Destruktor, wenn delete auf einen
polymorphen Zeiger auf C angewendet werden können soll.


Nun der religiöse Teil:

Quote:
Wann ist es überhaupt
sinnvoll, einen nicht-virtuellen Destruktor zu deklarieren?

Meiner Meinung nach in allen anderen Fällen. Wenn ich die Entscheidung fälle,
dann nur für Destruktoren von Klassen, die obiger Beschreibung entsprechen.


Andere Leute haben eine andere Meinung. Z.B. habe ich die Empfehlung gelesen,
der Destruktor sei immer virtuell zu machen, wenn die Klasse noch andere
virtuelle Memberfunktionen habe. Für mich ist das Overkill.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Stefan Reuther
Guest





PostPosted: Wed Apr 28, 2004 10:00 pm    Post subject: Re: Wann macht man einen Destruktor virtuell? Reply with quote

Stephan Roth wrote:
Quote:
in welchen Fällen macht man einen Destruktor virtuell?

Wenn man beabsichtigt, von der Klasse abzuleiten.

Oder wenn man auf Nummer sicher gehen will - es ist quasi nie falsch.

Quote:
Wann ist es überhaupt sinnvoll, einen nicht-virtuellen
Destruktor zu deklarieren?

Wenn man eine Klasse schreibt, bei der es nicht sinnvoll ist, Subklassen
abzuleiten.

Ein Beispiel wäre std::string. Der hat gar keine virtuellen Methoden,
also ist es auch nicht sinnvoll, da was abzuleiten. Daher gewinnt man
ein paar Maschinenzyklen Geschwindigkeit, indem man den dtor ebenfalls
nicht virtuell macht.

Ein anderes Beispiel wäre std::auto_ptr. Eigentlich fast alles aus der
STL :-)


Stefan

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Ralf
Guest





PostPosted: Wed Apr 28, 2004 10:21 pm    Post subject: Re: Wann macht man einen Destruktor virtuell? Reply with quote

Eigentlich immer, wenn man eine Interfaceklasse definiert. Man muss ja davon
ausgehen, dass eine
abgeleitete Klasse etwas im Destruktor freigeben muss. Wenn der
Elternklassendestruktor nicht virtuell ist,
erreicht man den Kindklassendestruktor nicht.

www.oop-trainer.de

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Helmut Zeisel
Guest





PostPosted: Thu Apr 29, 2004 7:15 am    Post subject: Re: Wann macht man einen Destruktor virtuell? Reply with quote

Stefan Reuther wrote:

Quote:
Stephan Roth wrote:

in welchen Fällen macht man einen Destruktor virtuell?


Wenn man beabsichtigt, von der Klasse abzuleiten.

Nicht ganz; Gegenbeispiel: std::unary_function.

http://www.research.att.com/~bs/bs_faq2.html

"So when should I declare a destructor virtual? Whenever the class has
at least one virtual function."


Quote:

Wann ist es überhaupt sinnvoll, einen nicht-virtuellen
Destruktor zu deklarieren?


Wenn man eine Klasse schreibt, bei der es nicht sinnvoll ist, Subklassen
abzuleiten.

Ja, aber u.U. auch bei Klassen, bei denen abgeleitet wird, wie z.B.
std::unary_function. Dann sollte der Destruktor aber eigentlich
protected sein.

http://www.codecomments.com/forum272/message171131.html

"Destructors for base classes should be either virtual or protected."

Diese Regeliist aber nicht sehr bekannt und wird auch in der Standard
Library nicht eingehalten.

Helmut

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Helmut Zeisel
Guest





PostPosted: Thu Apr 29, 2004 7:31 am    Post subject: Re: Wann macht man einen Destruktor virtuell? Reply with quote

Helmut Zeisel wrote:


Quote:
"So when should I declare a destructor virtual? Whenever the class has
at least one virtual function."

PS: Stroustrup hat angeregt, das künftig in C++ zu erzwingen:

http://www.research.att.com/~bs/C++0x_panel.pdf

Bjarne Stroustrup: Directions for C++0x

Remove embarrassments
- Frequent questions, frequent novice errors
..) a vector and a string that are range checked by default
..) Prohibit default copying of objects with destructors
..) Give a class with virtual functions a virtual destructor by default

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Helmut Zeisel
Guest





PostPosted: Thu Apr 29, 2004 7:38 am    Post subject: Re: Wann macht man einen Destruktor virtuell? Reply with quote

Helmut Zeisel wrote:

Quote:
"Destructors for base classes should be either virtual or protected."

Diese Regeliist aber nicht sehr bekannt und wird auch in der Standard
Library nicht eingehalten.

Da habe ich noch einen besseren Link dazu gefunden:

http://www.gotw.ca/publications/mill18.htm

Helmut

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Martin Kaul
Guest





PostPosted: Thu Apr 29, 2004 8:23 am    Post subject: Re: Wann macht man einen Destruktor virtuell? Reply with quote

Stefan Reuther wrote:

Quote:
Stephan Roth wrote:

in welchen Fällen macht man einen Destruktor virtuell?


Wenn man beabsichtigt, von der Klasse abzuleiten.

Oder wenn man auf Nummer sicher gehen will - es ist quasi nie falsch.

und wenn man will das man von der Klasse ableiten muss,
dann kann man ihn pure virtual machen. Dann kann keine Instanz
von der Basisklasse erzeugt werden.

tschaule
Martin

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Dietmar Kuehl
Guest





PostPosted: Thu Apr 29, 2004 8:55 am    Post subject: Re: Wann macht man einen Destruktor virtuell? Reply with quote

Stefan Reuther <stefan.news (AT) arcor (DOT) de> wrote:
Quote:
Stephan Roth wrote:
in welchen Fällen macht man einen Destruktor virtuell?

Wenn man beabsichtigt, von der Klasse abzuleiten.

Genauer: wenn es vorkommen kann, dass ein Objekt einer abgeleiteten
Klasse mittels eines Zeigers auf eine Basisklasse freigegeben wird.

Quote:
Oder wenn man auf Nummer sicher gehen will - es ist quasi nie falsch.

Es ist in dem Sinne "nie falsch", dass sich die Semantik eines korrekten
Programms durch zusätzliche virtuelle Destruktoren nicht ändert. Dafür
ändert sich aber zB. die Objektgröße und die Laufzeit. Für mich ist ein
virtueller Destruktor falsch, sofern er nicht in einer Basisklasse für
dynamische Bindung verwendet wird...

Quote:
Wann ist es überhaupt sinnvoll, einen nicht-virtuellen
Destruktor zu deklarieren?

Wenn man eine Klasse schreibt, bei der es nicht sinnvoll ist, Subklassen
abzuleiten.

.... und sie dynamisch polymorph zu verwenden.
--
<mailto:dietmar_kuehl (AT) yahoo (DOT) com> <http://www.dietmar-kuehl.de/>
<http://www.contendix.com> - Software Development & Consulting

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Christoph Rabel
Guest





PostPosted: Thu Apr 29, 2004 9:46 am    Post subject: Re: Wann macht man einen Destruktor virtuell? Reply with quote

Helmut Zeisel wrote:
Quote:

Bjarne Stroustrup: Directions for C++0x

Remove embarrassments
- Frequent questions, frequent novice errors
.) a vector and a string that are range checked by default

Gefällt mir nicht, wenn zwingend ein (compiletime-)assert drinnen
stecken müsste, würde mir das besser gefallen.

Quote:
.) Give a class with virtual functions a virtual destructor by default

Nu, dann braucht man aber wieder eine Option um das abzustellen! Denn
z.B. COM Interfaces dürfen keinen virtuellen Destruktor haben, haben
aber nur virtuelle Funktionen.
Es sind also Fälle möglich, in denen man keinen virtuellen Destruktor
haben darf.

mfg

Christoph

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Helmut Zeisel
Guest





PostPosted: Thu Apr 29, 2004 10:32 am    Post subject: Re: Wann macht man einen Destruktor virtuell? Reply with quote

Christoph Rabel wrote:

Quote:
Helmut Zeisel wrote:


Bjarne Stroustrup: Directions for C++0x

Remove embarrassments
- Frequent questions, frequent novice errors
.) a vector and a string that are range checked by default


Gefällt mir nicht, wenn zwingend ein (compiletime-)assert drinnen
stecken müsste, würde mir das besser gefallen.

Ich nehme eher an, er meint etwas in der Art std::checked_vector und
std::checked_string, das Du jederzeit umstellen kannst, insbesondere mit
potentiellen Template typedefs:

template<typename T> std::checked_vector<T> myVec<T>;

Quote:
.) Give a class with virtual functions a virtual destructor by default


Nu, dann braucht man aber wieder eine Option um das abzustellen! Denn
z.B. COM Interfaces dürfen keinen virtuellen Destruktor haben, haben
aber nur virtuelle Funktionen.
Es sind also Fälle möglich, in denen man keinen virtuellen Destruktor
haben darf.

Das ist ein interessanter Punkt; comp.std.c++ waere aber der richtige
Ort dafuer.

Helmut
Quote:

mfg

Christoph


--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Helmut Zeisel
Guest





PostPosted: Thu Apr 29, 2004 12:13 pm    Post subject: Re: Wann macht man einen Destruktor virtuell? Reply with quote

Christoph Rabel wrote:

Quote:
z.B. COM Interfaces dürfen keinen virtuellen Destruktor haben, haben
aber nur virtuelle Funktionen.

Ich habe darueber jetzt kurz nachgedacht und verstehe es nicht - kannst
Du mir erklaeren, warum das so ist?

Helmut

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Stefan Reuther
Guest





PostPosted: Thu Apr 29, 2004 2:41 pm    Post subject: Re: Wann macht man einen Destruktor virtuell? Reply with quote

Hallo,

Dietmar Kuehl wrote:
Quote:
Stefan Reuther <stefan.news (AT) arcor (DOT) de> wrote:
[virtueller dtor]
Oder wenn man auf Nummer sicher gehen will - es ist quasi nie falsch.

Es ist in dem Sinne "nie falsch", dass sich die Semantik eines korrekten
Programms durch zusätzliche virtuelle Destruktoren nicht ändert.

Das meinte ich. Primäres Ziel beim Entwickeln von Software sollte ja
wohl die Korrektheit sein.

Quote:
Dafür ändert sich aber zB. die Objektgröße und die Laufzeit. Für mich
ist ein virtueller Destruktor falsch, sofern er nicht in einer
Basisklasse für dynamische Bindung verwendet wird...

....Effizienz ist dann das zweite Ziel. Das 'virtual' einer Funktion zu
entfernen ist für mich eine Mikrooptimierung. Es muss bezüglich der
Geschwindigkeit auch nicht mal was bringen; ich hab hier Code, der mit
virtuellen Funktionen schneller ist als ohne (fragt aber bitte nicht
wieso, vielleicht auch nur irgendwelche Cache-Sauereien).


Stefan

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Christoph Rabel
Guest





PostPosted: Thu Apr 29, 2004 2:53 pm    Post subject: Re: Wann macht man einen Destruktor virtuell? Reply with quote

Helmut Zeisel wrote:
Quote:
Christoph Rabel wrote:

z.B. COM Interfaces dürfen keinen virtuellen Destruktor haben, haben
aber nur virtuelle Funktionen.

Ich habe darueber jetzt kurz nachgedacht und verstehe es nicht - kannst
Du mir erklaeren, warum das so ist?

Ich weis es leider selber nicht mehr genau, das Problem liegt in VB und
Skriptsprachen begraben.

Die kommen damit nicht zurecht. Ist kein C++ Constraint.

Wenns dich genauer interessiert, kann ichs nachschlagen.

mfg

Christoph

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Goto page 1, 2, 3  Next
Page 1 of 3

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.