Gilt "The Rule of Zero" auch für Klassen mit virtuellen Methoden?

8

Ich finde Die Nullregel wie auch auf Peter Sommerlads Slides (S. 32) sehr überzeugend.

Obwohl ich mich erinnere, dass es eine strikte Regel gab, dass one hat, um den Destruktor virtuell zu definieren , wenn die Klasse virtuelle Mitglieder und ist tatsächlich abgeleitet.

%Vor%

Der Körper des Destruktors kann sogar leer sein (er benötigt nur den Eintrag in der vtbl).

Ich glaube mich daran zu erinnern, dass wenn die Hierarchie verwendet wird

%Vor%

Dann ist es wichtig, dass delete obj den korrekten Destruktor aufruft . Ist es richtig, dass, wenn ich die Destruktordefinition vollständig auslasse, würde nicht virtuell werden , und daher würde der falsche d'or genannt werden?

%Vor%

Das führt mich zu meiner letzten Frage:

  • Ist die "Rule of Zero" auch in Hierarchien mit virtuellen Methoden
  • gültig?
  • oder muss ich in diesen Fällen den virtuellen Destruktor definieren?

Bearbeiten: Wie ich in einer Antwort erinnert wurde, hatte meine 1sr-Version der Frage die falschen Annahmen. Der relevante (virtuelle) Destruktor ist in Base , nicht Derived . Aber meine Frage lautet: Muss ich (virtuelle) Destruktoren überhaupt deklarieren?

    
towi 07.02.2014, 20:33
quelle

1 Antwort

5

Es ist eigentlich der Basisdestruktor, der als virtuell deklariert werden muss und in abgeleiteten Klassen automatisch virtuell ist:

%Vor%

Aber ansonsten gilt immer noch die Regel von Null.

Wenn Sie es so machen, wie Sie es getan haben, oder wenn Sie den% destructor virtual weglassen, erhalten Sie einfach undefiniertes Verhalten, wenn delete eines abgeleiteten Objekts durch einen Basiszeiger verändert.

    
user3175411 07.02.2014 20:35
quelle