Erben von std::vector
-
Ich hab mal gelesen, dass man von den Klassen der Standardbibliothek nicht erben soll, da sie keinen virtuellen Destruktor haben. Was heißt das nun genau? Wenn ich z.B. von std::vector erbe, aber den Destruktor meiner Klasse nicht brauche (da ich kein new, new[] etc. verwende), wäre das dann trotzdem problematisch?
Ich weiß, dass ich std::vector auch als Attribut verwenden kann, aber es wäre dann recht aufwendig, alle Methoden neu zu schreiben, die std::vector bereits hat.
-
Ich weiß, dass ich std::vector auch als Attribut verwenden kann, aber es wäre dann recht aufwendig, alle Methoden neu zu schreiben, die std::vector bereits hat.
Wie waere es, nur die zu schreiben, die du brauchst? Erben von STL-Container wuerde ich als "bad practise" empfinden.
Ansonten: http://www.parashift.com/c++-faq-lite/virtual-dtors.html
In particular, here's when you need to make your destructor virtual:
•if someone will derive from your classInterpretiere ich wie folgt: Wenn jemand seiner Klasse erlaubt, Teil einer Klassenhierarchie zu sein, so ist der der Destuktor virtuell. Wenn dir jemand mitteilen moechte, dass die Klasse nicht Teil einer Klassenhierarchie sein soll, dann ist er eben nicht virtuell. Im Falle von std::vector ist der Destruktor nicht virtuell, d.h. es ist nicht fuer Vererbung gedacht. Jedoch verbietet dir niemand, vector so zu nutzen wie du es fuer richtig haeltst.
aber den Destruktor meiner Klasse nicht brauche
Egal, was du damit meinst: Es ist falsch formuliert.
-
Das klingt mal nach einem Fall für private Vererbung.
-
Ramanujan schrieb:
Ich hab mal gelesen, dass man von den Klassen der Standardbibliothek nicht erben soll, da sie keinen virtuellen Destruktor haben. Was heißt das nun genau?
std::vector * bla = new YourClass; delete bla;Der Destruktor von YourClass wird nicht gerufen.
Ramanujan schrieb:
Wenn ich z.B. von std::vector erbe, aber den Destruktor meiner Klasse nicht brauche (da ich kein new, new[] etc. verwende), wäre das dann trotzdem problematisch?
Ich sehe keinen technischen Grund. Tatsache ist aber, dass die Member in Deiner Klasse eben nicht abgebaut werden und falls es mal Compiler gibt, bei denen z.B. "int" als Objekte, die destruktuiert werden müssen, implementiert sind (#define int MyIntClass), könnte das Ärger geben.
Ramanujan schrieb:
Ich weiß, dass ich std::vector auch als Attribut verwenden kann, aber es wäre dann recht aufwendig, alle Methoden neu zu schreiben, die std::vector bereits hat.
Mir scheint, Du bist Dir der Probleme bewusst und hast für Dich beantwortet, dass Du kein Problem hast.
Du musst Dir halt im Klaren sein, dass Du eine potentielle Fehlerquelle baust, wenn Deine Klasse erweitert werden sollte. Es stellt sich also die Frage, ob Du eher der pragmatische Typ bist oder der sichere Typ.
Klopfst Du Nägel mit der Zange in die Wand, wenn der Hammer im Nebenzimmer liegt?
Es wird immer Leute geben, die Dir erklären, dass man so etwas nicht macht, aber der Nagel ist drin. Es sieht aber nicht "professionell" aus.