title: Non-virtual father class destructor
body: <pre><code>class Person
  {
  public:
      Person(std::string&amp; name,long id) : name_(name), id_(id) {}
      ~Person() {}
  private:
      std::string&amp; name_;
      long id_;
  };
  
  class Student : public Person
  {
  public:
      Student(std::string&amp; name, long id) : Person(name,id) {}
      Student(std::string&amp; name, long id, const std::vector&lt;int*&gt;&amp; courses) : Person(name,id), courses_(courses) {}
      virtual ~Student() {
          std::vector&lt;int*&gt;::iterator it;
          for (it = courses_.begin(); it != courses_.end(); ++it)
          delete (*it);
      }
      const std::vector&lt;int*&gt;&amp; getCourses() const { return courses_; }
  private:
      std::vector&lt;int*&gt; courses_;
  };
  
  int main(){
      std::string name("Rina");
      std::vector&lt;int*&gt; courses;
      courses.push_back(new int(1345));
      Person* p = new Student(name,37,courses);
      Student* s = (Student*)p;
      std::cout &lt;&lt; (*(s-&gt;getCourses().at(0)));
      delete p;
  }
  </code></pre>
  
  <p>I understand that the</p>
  
  <pre><code>delete p;
  </code></pre>
  
  <p>makes us realize the problem that </p>
  
  <pre><code>~Person()
  </code></pre>
  
  <p>is not virtual. 
  My question is: why should </p>
  
  <pre><code>~Person() 
  </code></pre>
  
  <p>be virtual?</p>