Virtueller Destruktor für Boost: nicht kopierbare Klassen?

8

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?

    
TERACytE 12.01.2010, 20:45
quelle

5 Antworten

13

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.

    
Terry Mahaffey 12.01.2010, 20:49
quelle
9

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.

    
Omnifarious 12.01.2010 21:04
quelle
3

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.

    
Beanz 12.01.2010 20:51
quelle
3

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%     

Ashish 12.01.2010 21:09
quelle
1

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 :

deklarieren %Vor%     
Max Lybbert 12.01.2010 21:43
quelle

Tags und Links