Når skal man bruke virtuelle ødeleggere?
Jeg har en solid forståelse av det meste av OO-teori, men den ene tingen som forvirrer meg mye er virtuelle destruktorer.
Jeg trodde at destruktoren alltid blir kalt uansett hva og for hvert objekt i kjeden.
Når er det meningen at du skal gjøre dem virtuelle og hvorfor?
1409
3
Virtuelle destruktorer er nyttige når du potensielt kan slette en forekomst av en avledet klasse gjennom en peker til basisklassen:
Her vil du legge merke til at jeg ikke erklærte Base's destructor for å være
virtuell
. Nå, la oss ta en titt på følgende utdrag:Siden Base's destructor ikke er
virtuell
ogb
er enBase*
som peker til etAvledet
objekt, hardelete b
udefinert oppførsel:I de fleste implementasjoner vil kallet til destruktoren løses som en hvilken som helst ikke-virtuell kode, noe som betyr at destruktoren til basisklassen vil bli kalt, men ikke den til den avledede klassen, noe som resulterer i en ressurslekkasje.
For å oppsummere, gjør alltid baseklasser; destruktorer
virtuelle
når de er ment å bli manipulert polymorfisk.Hvis du vil forhindre sletting av en forekomst gjennom en baseklassepeker, kan du gjøre baseklassens destruktor beskyttet og ikke-virtuell; ved å gjøre det, vil kompilatoren ikke la deg kalle
delete
på en baseklassepeker.Du kan lære mer om virtualitet og virtual base class destructor i denne artikkelen fra Herb Sutter.
Deklarer destruktorer virtuelle i polymorfe basisklasser. Dette er punkt 7 i Scott Meyers' Effektiv C++. Meyers fortsetter med å oppsummere at hvis en klasse har en hvilken som helst virtuell funksjon, bør den ha en virtuell destruktor, og at klasser som ikke er designet for å være basisklasser eller ikke er designet for å brukes polymorfisk, bør ikke erklære virtuelle destruktorer.
Gjør destruktoren virtuell når klassen din er polymorf.