Podczas nadpisywania klasy w C ++ (za pomocą wirtualnego destruktora) implementuję ponownie destruktor jako wirtualny w klasie dziedziczącej, ale czy muszę wywoływać podstawowy destruktor?
Jeśli tak, to wyobrażam sobie, że to coś takiego ...
MyChildClass::~MyChildClass() // virtual in header
{
// Call to base destructor...
this->MyBaseClass::~MyBaseClass();
// Some destructing specific to MyChildClass
}
Czy mam rację?
c++
destructor
Nick Bolton
źródło
źródło
delete
wskaźnika do klasy podstawowej powoduje błąd segmentacji?Nie, nie musisz wywoływać podstawowego destruktora, podstawowy destruktor jest zawsze wzywany przez pochodną destruktor. Proszę zobaczyć moją pokrewną odpowiedź tutaj dotyczącą kolejności zniszczenia .
Aby zrozumieć, dlaczego chcesz wirtualnego destruktora w klasie podstawowej, zapoznaj się z poniższym kodem:
Kiedy to zrobisz:
Następnie, jeśli nie masz wirtualnego destruktora w B, wywoływana będzie tylko ~ B (). Ale ponieważ masz wirtualny destruktor, najpierw zostanie wywołane ~ D (), a następnie ~ B ().
źródło
Co powiedzieli inni, ale zauważ również, że nie musisz deklarować destruktora jako wirtualnego w klasie pochodnej. Po zadeklarowaniu wirtualnego destruktora, tak jak w klasie bazowej, wszystkie pochodne destruktory będą wirtualne, niezależnie od tego, czy je zadeklarujesz, czy nie. Innymi słowy:
źródło
Nie. W przeciwieństwie do innych metod wirtualnych, w których jawnie wywołujesz metodę Base z pochodnej w celu „połączenia” wywołania, kompilator generuje kod do wywoływania destruktorów w odwrotnej kolejności, w jakiej zostały wywołane ich konstruktory.
źródło
Nie, nigdy nie nazywasz niszczyciela klasy bazowej, zawsze jest wywoływany automatycznie, jak zauważyli inni, ale oto dowód koncepcji z wynikami:
Dane wyjściowe to:
Jeśli ustawisz destruktor klasy bazowej jako wirtualny, który należy, wyniki przypadku 3 będą takie same jak przypadku 1 i 2.
źródło
Nie. To jest automatycznie wywoływane.
źródło
Destruktory w C ++ są automatycznie wywoływane w kolejności ich konstrukcji (pochodne, a następnie podstawowe) tylko wtedy, gdy zadeklarowany jest destruktor klasy podstawowej
virtual
.Jeśli nie, to w momencie usuwania obiektu wywoływany jest tylko destruktor klasy bazowej.
Przykład: Bez wirtualnego niszczyciela
Wynik
Przykład: Z wirtualnym niszczycielem bazy
Wynik
Zaleca się zadeklarowanie destruktora klasy bazowej jako
virtual
przeciwnym razie powoduje on niezdefiniowane zachowanie.Odniesienie: Virtual Destructor
źródło