If we define a abstract class which has a pure virtual destructor, why do we have to give a definition of a destructor in the abstract class?
Only a virtual dtor can be declared as pure. But then, since you add a declaration, you must implement the body of the dtor. As already mentioned, the destructors call their parent dtor, all up to the chain of inheritance.