Virtuellen Destruktor mit virtuellen Mitgliedern, die in C++11

In diesen Folien über C++11/14 standard, auf Folie 15 der Autor schreibt, dass "viele klassische Codierung Regeln [sind] nicht mehr anwendbar," in C++11. Er schlägt vor, eine Liste von drei Beispielen, und ich Stimme zu, die Regel der Drei und das Speicher-management.

Jedoch seine zweite Beispiel ist die "Virtuellen Destruktor mit virtuellen Mitglieder" (nur, dass). Was bedeutet es? Ich weiß, man muss erklären, wie virtuelle Basisklasse destructor, um die richtige Destruktor, wenn wir so etwas wie

Base *b = new Derived;
...
delete b;

Dies ist gut erklärt hier: Wenn man virtuelle Destruktoren?

Aber es ist nutzlos, jetzt in C++11 zu erklären, Ihre virtuelle Destruktor, wenn Sie virtuelle Mitarbeiter?

  • Dies ist nur eine Vermutung, aber bei der Verwendung von smart-Pointer, können Sie ordnen die Dinge so, dass der richtige Destruktor aufgerufen wird, auch wenn die Basis-Destruktor nicht virtuell. Dies geschieht aus der box mit shared_ptr.
  • Die Aussagen zu der Wirkung, dass die in der Regel aus drei oder die Notwendigkeit für einen virtuellen Destruktor nicht mehr notwendig sind, sind schlicht falsch. Keine der neuen Funktionen haben sich etwas geändert in dieser Hinsicht.
  • Über die Regel der Drei, der Autor könnte auch bedeuten, dass es veraltet ist, da nun es ist die Regel der Vier/Fünf. Für die Regel der Null, ich glaube wirklich, dass es sinnvoll ist, aber unter der Bedingung, dass Ihre Klassen verwenden, die RAII-Prinzip für alle Ressourcen, die Sie besitzen.
  • Nicht wirklich. Die meisten Klassen brauchen nicht die zusätzliche Komplexität der Unterstützung bewegen. (Und Klasse, die Ressourcen verwendet, die muss freigegeben werden, richtig arbeiten benötigen in der Regel viel mehr als das, was die üblichen RAII-Klassen tun können.)
  • Sie fehlt der Punkt. Wenn alle Ihre nicht-triviale Mitglieder haben eine richtige Destruktor oder ein RAII-Typ mit einem geeigneten deleter (ob das gleich löscht den Speicher oder führt komplizierter cleanup), dann gibt es keine zusätzliche Komplexität zu unterstützen verschieben. Sie sagen einfach Foo(Foo&&) = default; und es Einfach Funktioniert™. Und weil alle Ihre Mitglieder sich selbst reinigen, können Sie auch Standard-Destruktor. Es erfordert einen anderen Ansatz zur Klasse design, aber das ist der Ansatz von Prof. Sommerlad befürwortet in diesen Folien. (Nicht sicher über die virtuelle bisschen aber ich werde ihn Fragen.)
  • die Antwort von PeterSom scheint mir perfekt...
  • Es ist in der Tat! Ich wurde gefragt, für details über diese gleitet, und eine Antwort bekommen, von dem Autor selbst. 🙂 Ich werde belohnen Sie seine Antwort mit der bounty und die beste Antwort, sobald die bounty fertig (morgen). Bezweifle ich, es wird besser beantworten...

Schreibe einen Kommentar