2017-01-29 1 views
0

Betrachten Sie diese zwei Klassen in C++ 11:Wie kann ich die Zerstörung eines übergeordneten Instanzmitglieds sicherstellen?

class A 
{ 
    ArbitraryClass someInstance; 
}; 

class B : public A 
{ 

}; 

Und ich B als solche betrachten:

B *foo = new B; 
delete foo; 

Wie ich verstehe, die implizite destructor von A wird hier nicht genannt werden.

Wird someInstance immer noch unter diesen Umständen zerstört, weil es als Mitglied von B "assoziiert" wird? Oder muss ich einen virtuellen Destruktor unter A deklarieren, um automatisch die Zerstörung des Mitglieds auszulösen?

+7

"Wie ich verstehe, wird der implizite Destruktor von A hier nicht aufgerufen werden." Warum denkst du, dass? Hast Du es versucht? Ohne virtuelle Destruktoren wird der Destruktor des statischen Variablentyps des Objekts zusammen mit allen übergeordneten Typen aufgerufen. Bei einem virtuellen Destruktor wird der Destruktor des dynamischen Objekttyps mit allen übergeordneten Typen aufgerufen. – xaxxon

+1

Gute Bücher: https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – Galik

+0

Ich denke, du bist verwirrt.Ihre Frage würde mehr Sinn ergeben (als ein Punkt des Verständnisses, nicht der Verwirrung), wenn "someInstance" ein Mitglied von "B" und "foo" "A *" wäre. – WhozCraig

Antwort

6

Sie benötigen einen virtuellen Destruktor in einem statisch bekannten Klasse delete Ausdrucks (in Ihrem Fall B), wenn diese Klasse von der am meisten abgeleiteten Klasse des Objekts (in Ihrem Fall auch B) unterscheidet. In Ihrem Fall sind diese Klassen die gleichen, so dass Sie keinen virtuellen Destruktor brauchen: alles ist richtig zerstört. Aber wenn Sie den Zeigertyp A* gemacht hätten, dann würden Sie einen virtuellen Destruktor in A benötigen, um Undefined Behavior (Nasal Daemons und so weiter) zu vermeiden.

4

Wie stelle ich sicher ...

Meist durch nichts zu tun.

Wie ich verstehe, wird der implizite Destruktor von A hier nicht aufgerufen werden.

Falsch.

Ist someInstance noch unter diesen Umständen zerstört

Ja.

weil es als Mitglied von B "assoziiert" wird?

Weil es ein Mitglied von A ist, und A ist zerstört.

Oder muss ich einen virtuellen Destruktor auf A deklarieren, um automatisch die Zerstörung des Mitglieds auszulösen?

Nicht im Falle der Code, den Sie geschrieben, aber wenn (was wahrscheinlich ist) Sie Polymorphismus wird durch Zeiger auf A löschen, die B oder andere Subklassen von A könnte man A eine virtuelle destructor geben sollte.

Verwandte Themen