Die Antwort auf Ihre Frage lautet: oft, aber nicht immer. Wenn Ihre abstrakte Klasse den Klienten verbietet, delete auf einen Zeiger auf sie aufzurufen (oder wenn sie dies in ihrer Dokumentation sagt), können Sie keinen virtuellen Destruktor deklarieren.
Sie können Clients verbieten, delete auf einen Zeiger darauf aufzurufen, indem Sie den Destruktor schützen. Auf diese Weise ist es absolut sicher und vernünftig, einen virtuellen Destruktor wegzulassen.
Sie werden am Ende keine virtuelle Methodentabelle haben und Ihren Klienten Ihre Absicht signalisieren, sie durch einen Zeiger darauf nicht löschbar zu machen, also haben Sie in der Tat einen Grund, sie in diesen Fällen nicht als virtuell zu deklarieren.
[Siehe Punkt 4 in diesem Artikel: http://www.gotw.ca/publications/mill18.htm ]