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 <
010
06.09.2006, 10:28 Uhr
0xdeadbeef
Gott
(Operator)


Weil er es kann. Im Fall von Java vermute ich, dass der Hintergedanke große Projekte mit einem merkbaren Anteil an...ähm...weniger fähigen Programmierern waren, die auch von Klassen, die eigentlich überhaupt nicht dazu geeignet sind, erbten, wild in deren Eingeweiden rumwurschteln und nachher die Anforderung stellen, dass bestimmte Restriktionen aufgehoben werden, damit ihre dreckigen Hacks weiter funktionieren.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
06.09.2006, 10:59 Uhr
ao

(Operator)



Zitat von 0xdeadbeef:
...ähm...weniger fähigen Programmierern waren, die auch von Klassen, die eigentlich überhaupt nicht dazu geeignet sind, erbten, wild in deren Eingeweiden rumwurschteln ...

Um das zu verhindern, reicht es doch, die Eingeweide privat zu machen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
06.09.2006, 11:16 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von ao:

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

Damit niemand in einer Ableitung die Semantik der Klasse verändern kann.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
07.09.2006, 12:47 Uhr
Tommix



Hi,
ich wärme das nochmal auf. Stroustrup selbst hat nämlich auch eine Meinung zum dem Thema:
www.research.att.com/~bs/bs_faq2.html#no-derivation

- Tommix

Dieser Post wurde am 07.09.2006 um 12:47 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
07.09.2006, 13:21 Uhr
ao

(Operator)


Aha, interessant.

Zitat von Stroustrup:
Can I stop people deriving from my class?
Yes, but why do you want to? There are two common answers:

for efficiency: to avoid my function calls being virtual
for safety: to ensure that my class is not used as a base class (for example, to be sure that I can copy objects without fear of slicing)

Ist damit gemeint, dass wenn meine Klasse einen operator= hat, jede Ableitung ebenfalls einen operator= bekommen muss, damit eben nicht nur die Basis, sondern auch die Erweiterungen der jeweiligen Ableitung kopiert werden?

Ich glaub, dann hab ichs verstanden.



ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
07.09.2006, 15:36 Uhr
Tommix



Das glaube ich nun eher nicht. Es kann ja durchaus sein, daß die Funktionalität der Basisklasse ausreicht und es in der abgeleiteten Klasse gar nicht mehr zu kopieren gibt. Gefährlich wäre eher der umgekehrte Fall: Ich überlade = und rufe weder den Op der Basisklasse noch implementiere ich dessen Funktionalität selbst noch mal.
- Tommix

Bearbeitung:

Das "Ich glaube nicht..." bezug sich nicht auf Deinen letzten Satz


Dieser Post wurde am 07.09.2006 um 15:37 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
07.09.2006, 17:34 Uhr
virtual
Sexiest Bit alive
(Operator)


Was den op= angeht:

In der Regel wird in einem op= niemals der op= der Basisklasse aufgerufen.
Wenn Dudiesen langen text, welcher es auch nicht explizt darstellt, nicht lesen willst, dann nur kurz folgendes:

Ich nehme an

C++:
class base {
   // Irgend eine Klasse mit überladenen op=
};

class derived {
     int addition;

public:
    derived& operator = (
         const derived& drvd) {
        
         addition = drvd.addition;      
         base::operator = (drvd); // Aufruf von op= der basisklasse
         return *this;
    }
};


Solcher Code ist potentiell gefährlich, weil der op= der Basisklasse eine Exception werfen kann, was ein kaputtes Object hinterlassen würde. Normalerweise wird ein op= bei angeleiteten Klassen mit Hilfe einer temp. Kopie von drvd und anschlieesendem swap realisiert:

C++:
    derived& operator = (
         const derived& drvd) {
         derived tmp(drvd);
         swap(tmp);
         return *this;
    }
        
    void swap(derived& drvd) {
          std::swap(drvd.addition, addition);
          base::swap(drvd); // Sollte vorhanden sein!
    }



Will sagen: es ist nicht trivial, den op= korrekt zu schreiben, im Falle daß base keine swap Methode bereitstellt mitunter richtig ekelhaft. Schon allein dieser Grund kann ausreichend sein, vererbung zu verbieten.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
08.09.2006, 08:09 Uhr
Tommix



'Morgen,
soweit hatte ich natürlich nicht gedacht. So gesehen kann man aber beim Vererben immer Mist bauen und aus einer funktionierenden Klasse eine nicht funktionierende erzeugen. Wenn man das weiter denkt, müßte man das Programmieren ganz und gar verbieten .
Aber was meint Stroustrup nun oben mit "slicing"?

Gruß, Tommix
 
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: