Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Private Destruktoren in Basisklassen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
05.09.2006, 00:09 Uhr
Yadgar



High!

Anlässlich einer Testfrage in meinem Lehrbuch (Aupperle, a. a. O. :-) S. 630) grübele ich darüber nach, ob private Destruktoren in Basisklassen ohne eigene Objekte tatsächlich immer sinnlos sind... zunächst vermutete ich ja, dass in der Basisklasse als public deklarierte Methoden, die ihrerseits explizit den Destruktor aufrufen, im public-Vererbungsmodus auch den die abgeleitete(n) Klasse(n) indirekt den Zugriff auf den Destruktor gestatten, aber ein Testprogramm belehrte mich eines Besseren...

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
05.09.2006, 00:21 Uhr
Blubber2063



Merke, alles was private ist wird nicht mitvererbt, sprich kein Zugriff von Kindklasse, wenn du das vermeiden willst, deklariere protected. Ansonsten ist der Destruktor eigentlich immer public und virtual zu halten. Der Destruktor wird ja von außen benutzt, es hat also keinen Sinn einen private Destruktor zu deklarieren.D u kannst natürlich bei dynamischer Speicherverwaltung eine private Memberfunktion nutzen die Speicher freigibt, aber das ist kein Destruktor, der ist nur dazu da, das die Klasse sauber wieder aufräumt was sie an resourcen so belegt hat. Und das wird nun mal von außen verlangt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
05.09.2006, 00:31 Uhr
Yadgar



High!


Zitat von Blubber2063:
Merke, alles was private ist wird nicht mitvererbt, sprich kein Zugriff von Kindklasse, wenn du das vermeiden willst, deklariere protected. Ansonsten ist der Destruktor eigentlich immer public und virtual zu halten. Der Destruktor wird ja von außen benutzt, es hat also keinen Sinn einen private Destruktor zu deklarieren.D u kannst natürlich bei dynamischer Speicherverwaltung eine private Memberfunktion nutzen die Speicher freigibt, aber das ist kein Destruktor, der ist nur dazu da, das die Klasse sauber wieder aufräumt was sie an resourcen so belegt hat. Und das wird nun mal von außen verlangt.


Das leuchtet ein... was wäre eigentlich, wenn friend-Deklarationen ebenfalls vererbbar wären (was sie natürlich glücklicherweise(?) nicht sind)? Ist meine folgende Antwort auf die gleichlautende Testfrage korrekt bzw. gibt es dazu noch mehr anzumerken?


Wären Freund-Deklarationen vererbbar, könnte auf diese Weise der Zugriffsschutz für private Mitglieder und Methoden der Basisklasse ausgehebelt werden, von Datenkapselung könnte dann keine Rede mehr sein.


Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog

Dieser Post wurde am 05.09.2006 um 00:31 Uhr von Yadgar editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
05.09.2006, 00:42 Uhr
Blubber2063



Naja das trifft es so ungefähr, friend deklarationen sind eh eine nicht so schöne Geschichte.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
05.09.2006, 00:47 Uhr
Yadgar



High!


Zitat von Blubber2063:
Naja das trifft es so ungefähr, friend deklarationen sind eh eine nicht so schöne Geschichte.


Freut mich zu hören, ich mache sichtlich Fortschritte... und werde den Spargelfeldern vielleicht doch noch entgehen! ;-)

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
05.09.2006, 10:43 Uhr
RHBaum



Naja, sag niemals nie ! :-)

Also aufn 1. blick machen private destruktoren Sinn in verbindung mit friends, wenn man die Klassen die ableiten duerfen in der basisklasse unter kontrolle haben will

Aufn 2. blick iss das aber nen ziemlich schraeges design, und man sollt sich fragen ob an der stelle nicht allgemein aggregation die bessere Wahl ist.

selbst protected destruktoren sollt man unter diesen gesichtspunkt noch mal genauer betrachten. Der Fall das man Instanzen nicht ueber nen basisklassenzeiger destroyen soll, tritt eigentlich ziemlich selten in der Praxis auf.

Gibt aber anwendungsfaelle, z.b. wenn man Instanzen aufn stack verhindern will (private destruktor), oder in komplexeren Faellen wo der Anwender keine direkte kontrolle der lebenszeit einer Instanz haben soll, in speziellen Objektfabriken (protected Destruktor).

Also zu 99.9% sollten destruktoren von basisklassen schon public sein, virtuell sowieso.

Ciao ...

Dieser Post wurde am 05.09.2006 um 10:47 Uhr von RHBaum editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
05.09.2006, 12:33 Uhr
0xdeadbeef
Gott
(Operator)


Destruktoren müssen nicht immer virtuell sein. Eine Klasse mit nicht-virtuellem Destruktor ist grob äquivalent zu einer final-Klasse in Java, d.h. man kann nicht von ihr erben. Es kommt zwar nicht unbedingt häufig vor, dass das Sinn macht, aber gelegentlich schon - und in solchen Fällen spart ein nicht-virtueller Destruktor halt ein paar CPU-Zyklen pro zerstörter Klasse.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
05.09.2006, 16:45 Uhr
Tommix




Zitat von 0xdeadbeef:
..., d.h. man kann nicht von ihr erben.

Es wäre nicht C++, wenn man's nicht eben doch könnte. Es ist falsch, verboten, macht man nicht... - aber können kann man schon.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
05.09.2006, 17:59 Uhr
0xdeadbeef
Gott
(Operator)


Ich bin der Meinung, dass der Standard es verbietet. Es gibt wohl nen Haufen (vor allem ältere) Compiler, die das trotzdem akzeptieren, aber z.B. neuere gccs meckern da.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
06.09.2006, 08:49 Uhr
ao

(Operator)



Zitat von 0xdeadbeef:
Eine Klasse mit nicht-virtuellem Destruktor ist grob äquivalent zu einer final-Klasse in Java, d.h. man kann nicht von ihr erben. Es kommt zwar nicht unbedingt häufig vor, dass das Sinn macht, aber gelegentlich schon - und in solchen Fällen spart ein nicht-virtueller Destruktor halt ein paar CPU-Zyklen pro zerstörter Klasse.

Das kann aber nicht der einzige Grund sein, ein paar CPU-Zyklen, oder? Bei C++ würde ich das glatt glauben, aber nicht bei Java oder C#. Die haben eigene Schlüsselwörter dafür, also muss es einen "richtigen" Grund geben.

Also, die Frage des Tages: Warum will jemand verbieten, dass von seiner Klasse abgeleitet wird?

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: