C++ is tricky. A few tips below are collected from all over the net.
- Why virtual destructor is required: Because you want the most derived class destructor to be callse, instead of the base destructor. Contrary to common concept, virtual destructor is not overridden and they are always called (in a chain), and pure virtual destructor must have an implementation thus it is exactly the same as a virtual destructor thus it causes the base class to become abstract. See this article about this tricky part, and this article.