class Parent
{
  virtual ~Parent(void){}
};
class Child : public Parent
{
  void ~Child(void){}
};
class Grandchild : public Child
{
  void ~Grandchild(void){}
};

Parent *p1 = new Grandchild;
Child *p2 = new Grandchild;


上記のような構成の時、Childクラスのデストラクタにもvirtualを付けた方がいいのでしょうか?
C++の解説サイトを回ると付けている方が多いのですが、付けずにp1やp2のように使った場合でも問題なくデストラクタが呼ばれたので、どうするべきか悩んでいます。
virtualを付けること、付けないことによる不利益などありましたら、教えていただけるとありがたいです。
なお、コンパイラはVisual Studio 2008を使用しています。