
IMHO these classes should have a virtual destructor as they are intended
to be used as base classes.
No they shouldn't. A virtual destructor is only needed when deleting through a base class pointer. This is explicitly forbidden by making the destructor protected.
I must respectfully disagree.
There are two ways to look at this 'should'. First, there is what is required or permitted by the standard. Second, there is what is useful in managing a software development project. When I am trying to help my juniors develop good programming habits, one of the things I want them to do is always provide a virtual destructor whenever they make one or more member functions virtual. That lets a team comprised of many more junior programmers than really really old guys like me avoid a lot of subtle bugs. And I don't see a significant down side to making a destructor virtual. Hence, when I am mentoring junior programmers, I routinely advise them to make destructors virtual whenever they need one of the other member functions to be virtual, whenever the issue arises.
Are you aware of a significant downside to making destructors virtual as a matter of habit? Why not just encourage the habit of making *public* destructors virtual in the presence of one or more other virtual methods? That is, after all, when a virtual destructor can be necessary.
Because I tend to let junior programmeers work only on those classes that would have a public destructor anyway. I find young, inexperienced programmers need to develop a good grounding on, or experience with, generally applicable patterns before being introduced to situations where one can usefully deviate from those patterns. I have seen kids graduate from college programs where they have had only one one semester course in C++ (and they then call themselves C++ programmers). When dealing with such kids, I really don't want to present them with everything they can do with the language. Pushing such kids too far too fast tends only to leave them frustrated and discouraged, and we then risk losing young people with little experience but tonnes of potential. So, I give them a general 'rule', and then only when they have enough experience to I take them to the next level of "you do not have to do this of you are going to do this other thing", i.e. introduce exceptions to the rule. There are only to ways of getting good programmeers: hire them away from other companies or train them in house (and if you opt for the latter, you have to adapt to where they are, rather than what you would expect from fine institutions like MIT). Again, can you point to a significant downside to having all destructors virtual? Cheers, Ted