If you don't provide a constructor to the parent, the compiler will generate one that tkaes not arguments and initializes all the class's memebers with their default constructors.
If a derived class doesn't explicitly call a parent's constructor, the compiler has it call the parent's default constructor (which would be the compiler-generated one if you didn't provide one).
When a local object whose type is the derived class goes out of scope, it calls the derived destructor and the parent destructor.
BUT
When a dynamically allocated object of the derived type is deleted through a pointer to the parent type, unless the destructor is declared virtual, only the parent destructor will get called (which is wrong, since part of the object doesn't get deleted).
Thus, if the class heirarchy will never be manipulated polymorphically, (i.e. all objects are going to be local), you can leave out the destructor. In this case, you should probably be using private inheritance to kill the possibility of anyone erroneously using the classes polymorphically.
Otherwise, you must put a virtual destructor in the parent class, even if it does nothing. It's good practice to do this whenever there's even a chance for your classes to be used polymorphically (i.e. you use public inheritance).