A rule of thumb in class design says that if a class has at least one virtual function, it should have a virtual destructor, too. This is because the presence of a virtual member function implies that the class may serve as a base class. To ensure that the right destructor is called when you’re using a pointer or a reference to a base that actually point to a derived object, the destructor must be virtual. For example:
class character_device{public: virtual int read(char * p, int sz)=0; virtual ~ character_device()=0;};class modem: public character device{//..public:int read(char * p, int sz); //implement pure virtual _method ~modem();};character_device * pcd=new modem; //..use pcddelete pcd; // ok, calls pcd->~modem()