Ich habe eine Frage zu folgendem Code:
%Vor%Meine Gedanken sind, dass MyClass nicht mithilfe von Konstruktion oder Zuweisung kopiert werden kann. Die Verwendung eines virtuellen Destruktors ist erforderlich, wenn ich die Ableitung von Klassen aus MyClass unterstützen möchte, die ich nicht unterstützen möchte. Ich habe nicht die Absicht, Zeiger auf diese Klasse zu erstellen und sie weiterzugeben.
Ich möchte keinen Singleton und ich sehe keinen Nachteil darin, den virtuellen Destruktor zu entfernen.
Führe ich ein potenzielles Problem ein, wenn ich den virtuellen Destruktor für eine nicht kopierbare Klasse entferne? Gibt es bessere Methoden zum Behandeln einer Klasse, die kein Singleton sein muss, aber ich möchte nur eine Instanz in einer anderen Klasse und keine Vererbung unterstützen?
Nein, der gesamte Punkt eines virtuellen Destruktors ist so abgeleitet, dass Klassen polymorph korrekt zerstören können. Wenn dies niemals eine Basisklasse sein wird, brauchen Sie sie nicht als virtuelle Klasse.
Die allgemeine Regel lautet: Wenn Ihre Klasse virtuelle Funktionen hat, benötigt sie einen virtuellen Destruktor. Wenn dies nicht der Fall ist, aber immer noch von einer Basisklasse abgeleitet ist, benötigt die Basisklasse (und damit Ihre Klasse) möglicherweise einen virtuellen Destruktor.
Das Ableiten der Klasse von boost::noncopyable
zählt nicht wirklich als abgeleitet von einer Basisklasse. boost::noncopyable
ist mehr wie eine praktische Annotation, die mit einigen Deklarationen gesichert wird, die den Compiler veranlassen, die Annotation zu erzwingen. Es ist nicht wirklich eine Basisklasse in irgendeinem herkömmlichen Sinne. Niemand wird jemals versuchen, einen Zeiger auf Ihre Klasse als Zeiger oder Verweis auf boost::noncopyable
zu übergeben. Und selbst wenn sie Ihren virtuellen Destruktor hätten, würde das nicht helfen, denn der Destruktor von boost::noncopyable
ist es nicht.
Und zuletzt, wie in einem Kommentar erwähnt wurde, erben Sie sogar privat von boost::noncopyable
, so dass es überhaupt nicht wirklich Vererbung ist, soweit es jemanden außerhalb der Klasse betrifft.
Es ist also wirklich nicht nötig, es zu einem virtuellen Destruktor zu machen.
Ich bin wirklich kein Fan der boost :: noncopyable Klasse als Ganzes. Warum deklarieren Sie nicht einfach den Kopierkonstruktor und den Zuweisungsoperator Ihrer Klasse als privat und definieren Sie sie nicht. Das wird dasselbe bewirken, und Sie können den virtuellen Destruktor ablegen.
Boost liefert nur einen virtuellen Destruktor, so dass Leute boost :: nicht kopierbare Objekte polymorph passieren können und sich trotzdem gut benehmen. Wenn Sie die Klasse nicht polymorph verwenden (Sie können sie sogar noch erben), brauchen Sie eigentlich keinen virtuellen Destruktor.
Virtueller Destruktor in der Basisklasse wird verwendet, um ein partielles Zerstörungsproblem wie:
zu vermeiden %Vor%Wenn Sie eine Klasse privat erben, führt der Compiler kein implizites Umwandeln von der abgeleiteten in die Basisklasse durch, und wenn Sie sicher sind, dass das abgeleitete Objekt niemals mit dem Basisklassenzeiger zerstört wird, brauchen Sie keinen virtuellen Destruktor in der Basisklasse / p> %Vor%
boost::noncopyable
soll sagen, dass Sie keine Kopien des Objekts wollen. Sie wissen, dass dies anders ist als das Ableiten von dem Objekt.
Es ist vollkommen in Ordnung, den virtuellen Destruktor loszuwerden, wenn Sie niemals von dem Objekt ableiten. Wenn Sie die Richtlinie "Nicht von diesem Objekt ableiten" erzwingen möchten, gibt es einen Weg . Leider gibt es keine boost::nonderivable
, um das für dich schön zu machen.
Wie im Link erwähnt, können Sie in C ++ 11 die Klasse final
:
Tags und Links c++ boost noncopyable