Classes having a non-virtual destructor aren't meant to be derived from (such classes are usually known as "concrete classes"). std::string, std::complex, and all STL containers are concrete classes. Why is inheriting from such classes not recommended? When you use public inheritance, you create an is-a relationship between the base class and the derived class. Consequently, pointers and references to base can actually point to a derived object. However, because the destructor isn't virtual, C++ will not call the entire destructor chain when you delete such an object. Foe example:
class A
{
public:
~A() // non virtual
{
// ...
}
};
class B: public A{ // bad; inheriting a non virtual dtor
public:
~B()
{
// ...
}
};
int main()
{
A * p = new B; // seemingly OK
delete p; // oops, B's dtor not called!
}
The result of failing to invoke an object's destructor is undefined behavior. Therefore, you shouldn't use publicly inherit from concrete classes.