2009-06-16 28 views
7

Jeśli zdefiniujemy abstrakcyjną klasę, która ma czysty wirtualny destruktor, dlaczego musimy podać definicję destruktora w klasie abstrakcji?Pytanie o czysty wirtualny destruktor

+0

Duplikat http://stackoverflow.com/questions/630950/pure-virtual-destructor-in-c – ralphtheninja

Odpowiedz

15

Destirator dla klasy bazowej musi zostać wywołany, gdy obiekt jest niszczony, więc potrzebuje definicji.

9

Jak zauważył Jesse, odziedziczone destruktory są zawsze wywoływane (są one wywoływane przez kompilator bez możliwości zastąpienia tego zachowania), więc oczywiste jest, że wirtualny destruktor musi mieć implementację. Więc jeśli czysty wirtualny destruktor musi mieć implementację, jaka jest różnica między czystym wirtualnym destruktorem a zwykłym wirtualnym destruktorem? Jeśli twoja klasa abstrakcyjna ma tylko deklarator wirtualnego destruktora i nie ma innych czystych metod wirtualnych, uczynienie destruktora czystym uniemożliwi komukolwiek tworzenie instancji klasy abstrakcyjnej.

3

Tylko wirtualny dtor może zostać zadeklarowany jako czysty. Ale potem, od dodania deklaracji, musisz wdrożyć ciało dtor. Jak już wspomniano, destruktory nazywają macierzystego dtora, aż do łańcucha dziedziczenia.

9

Ponieważ średnia tak mówi:

12.4.7 Destruktor może być uznana wirtualna (10.3) lub czystego wirtualnego (10,4); jeśli w programie zostaną utworzone jakiekolwiek obiekty tej klasy lub klasy pochodnej, zdefiniowany zostanie destruktor.

Powodem tego jest to, że nazywa się to jawnie, gdy obiekt klasy pochodnej zostanie zniszczony.

Zobacz również odpowiedzi na moje poprzednie pytanie: Under what circumstances is it advantageous to give an implementation of a pure virtual function?

+0

Co jest złego w tej odpowiedzi? Lub SO w tej sprawie? – Tobias

+1

Nie można powiedzieć, że nazywa się to "jawnie". Pomocne było odwołanie się do standardu, ale powinieneś edytować swoją odpowiedź, aby była bardziej poprawna formalnie. "jawnie" jest przeciwieństwem tego, jak zwykle wywoływane są destruktory. – nobar