Warum ist der Standarddestuktor für eine abstrakte Klasse nicht virtuell?

8

Betrachten Sie

%Vor%

An dieser Stelle ist es absolut offensichtlich, dass A eine abstrakte Klasse ist und niemals selbst instanziiert wird. Warum also fordert der Standard nicht, dass der automatisch erzeugte Destruktor auch virtuell sein muss?

Ich stelle mir diese Frage jedes Mal, wenn ich in meinen Interface-Klassen einen virtuellen Dummy-Deskriptor definieren muss, und sehe nicht, warum das Commitee dies nicht getan hat.

Also die Frage: Warum der generierte Destruktor in einer abstrakten Klasse nicht virtuell ist?

    
j0k 14.11.2012, 18:46
quelle

3 Antworten

8

Weil Sie in C ++ nicht dafür bezahlen, was Sie nicht brauchen, und ein virtueller Destruktor fügt Overhead hinzu (selbst in bereits polymorphen Klassen), der in vielen Fällen nicht benötigt wird. Zum Beispiel brauchen Sie möglicherweise keine polymorphe Zerstörung und wählen stattdessen einen geschützten Destruktor.

Stellen Sie sich als alternatives Szenario außerdem vor, dass Sie eine Klasse mit einer virtuellen Methode haben, die polymorphe Destruktion wünscht. Stellen Sie sich nun vor, dass die andere virtual -Methode nicht mehr benötigt und entfernt wird, aber eine polymorphe Zerstörung noch benötigt wird. Jetzt müssen Sie daran denken, zurückzugehen und einen virtuellen Destruktor hinzuzufügen oder unbestimmtes Verhalten zu erleiden.

Endlich denke ich, es wäre schwer zu rechtfertigen, die Standardvirtualität des Destruktors (und nur diese) zu ändern, je nachdem, ob eine Klasse polymorph oder nicht ist, anstatt einen Destruktor immer und nur dann konsequent zu machen, wenn es anders angefordert wird. p>     

Mark B 14.11.2012, 18:48
quelle
0

Ein virtueller Destruktor würde jedes Mal zu Dereferenzierung führen, wenn diese Klasse zerstört würde. Eher kleiner Overhead, aber C ++ möchte so viel Zeit wie möglich sparen. Auf jeden Fall ist es immer besser, explizit zu sein, als der impliziten Compiler-Magie zu vertrauen. C ++ 's Motto: "Vertraue dem Programmierer".

LG nicht

    
Peter Wildemann 14.11.2012 18:58
quelle
0

Als der C ++ - Standard geschrieben wurde, wurde geschrieben, dass ich daran denke, dass es auf verschiedenen Plattformen verwendet wird. Einige davon haben möglicherweise Speicherbeschränkungen. Durch das Hinzufügen von Virtual-Ism erhöhen wir den Overhead. Deshalb muss zu diesem Zeitpunkt jede Methode / dtor vom Programmierer explizit virtuell gemacht werden, wann immer wir Polymorphismus benötigen.

Nun kommt die Frage, warum Standard-C ++ - Implementierung des Standard-Destruktors der abstrakten Klasse nicht möglich ist. Denkst du nicht, dass es seltsam ist, eine andere Implementierung zu haben, und es wird auch Verwirrung stiften. Und was ist mit dem Fall (wie klein er auch ist), wenn du den Distruktor nicht virtual brauchst (um Speicher zu sparen) Speicher

    
pranav 03.05.2013 09:58
quelle

Tags und Links