title: Why should one not derive from c++ std string class?
body: <p>I wanted to ask about a specific point made in Effective C++. </p>
  
  <p>It says:</p>
  
  <blockquote>
    <p>A destructor should be made virtual if a class needs to act like a polymorphic class. It further adds that since <code>std::string</code> does not have a virtual destructor, one should never derive from it. Also <code>std::string</code> is not even designed to be a base class, forget polymorphic base class. </p>
  </blockquote>
  
  <p>I do not understand what specifically is required in a class to be eligible for being a base class (not a polymorphic one)?</p>
  
  <p>Is the only reason that I should not derive from <code>std::string</code> class is it does not have a virtual destructor? For reusability purpose a base class can be defined and multiple derived class can inherit from it. So what makes <code>std::string</code> not even eligible as a base class?</p>
  
  <p>Also, if there is a base class purely defined for reusability purpose and there are many derived types, is there any way to prevent client from doing <code>Base* p = new Derived()</code> because the classes are not meant to be used polymorphically?</p>