Ich habe einige Artikel gelesen, und wie sie sagen, virtuellen Haupt destructor Anwendungsfälle sind:Virtuelle destructor Use Cases
abgeleitet Klassen dynamische Datenzuordnung von Heap haben kann, dh ‚eigene‘, dass Datenobjekt. Sie brauchen also eine Löschroutine im Destruktor. Deletion durch Basisklassenzeiger erfordert
virtual
Erklärung Destruktoren in allen abgeleiteten Klasse bis die mit dynamischen Datenzuordnung ( Basisklasse auch erfordert)Diese Klasse hat
virtual
Methoden. Aber das ist mir unklar. Ruft einfachvirtual
Methoden durch Basis Klassenzeiger führt immer zu den meisten abgeleiteten -Realisierungsaufrufe. Der einzige Ausschluss für diese Regel ist die Bauphase. Literaly, während esthis
Objekt ist kein abgeleitet Typ noch, auch wenn später sein wird. Ok, was ist mit der Zerstörungsphase? Wie ich verstanden habe, ist die Regel in der umgekehrten Reihenfolge. Egal, war Destruktor einer Klasse in der Hierarchie alsvirtual
deklariert, während jeder Destruktorthis
Zeiger als ob dieser Klasse Typ verwendet wurde, wurden alle abgeleiteten wurden bereits zerstört wegenvirtual
dr, oder nicht zerstört (und das kann hypothetisch in Ordnung sein etwas Design). Vielleicht ist das der Fall, warum muss d-r virtuell sein? Vtable wird Einträge für abgeleitete Klasse haben, und Aufrufvirtual
Methoden in einigen Basis Klasse von d-r wird in UB führen? Ok, aber diese Regel gilt nur für den Fall, wenn diese Klasse ruft einigevirtual
Methoden in d-r, und sie haben Realisierung in abgeleitet Klassen.
meiner Meinung nach, dass es auch einen Fall ohne dynamische Datenzuordnung kann ist, keine virtuellen Methoden in allen Hierarchie, aber immer noch abgeleitet Destruktoren können einige wichtige Aufgaben beim Löschen tun (Synchronisierungen, entriegelt und so weiter) . Und wir brauchen virtuelles d-r in der Basisklasse. Mag sein, dass solche Fälle Ergebnisse von schlechtem Design sind.
Wie auch immer, Entwickler einer öffentlichen Klasse kann nicht 100% wissen, ob abgeleitete Klassen einige virtuelle Methoden in d-r verwenden oder nicht, oder dynamische Daten zuweisen. Also, muss ich richtig sagen, dass jede öffentliche Klasse, die nicht als final
deklariert ist, d-r als virtuell deklarieren muss? Nur das Schlüsselwort final
garantiert, dass jeder Zeiger auf diese Klasse immer von diesem Typ ist und daher nicht-virtuell sicher gelöscht werden kann.
Verwandte: http://www.gotw.ca/publications/mill18.htm – SingerOfTheFall
NO. Was die Klasse selbst intern tut oder enthält, ist völlig irrelevant. Das einzige Kriterium ist, wie es verwendet wird.Wenn ein abgeleitetes Klassenobjekt über einen Basiszeiger gelöscht werden soll, muss die Basisklasse über einen virtuellen Destruktor verfügen. Nicht mehr, nicht weniger. –
Entwickler können sich jedoch nicht sicher sein, ob der Basisklassenzeiger als Zeiger auf die abgeleitete Klasse verwendet wird, den andere Entwickler verwenden und auf diese Weise verwenden. Daher sollte der Entwickler der Basisklasse d-r als virtuell deklarieren. Oder es gibt eine Chance von UB. –