When you delete a derived object through a base class pointer, the destructor that runs depends on whether the base destructor is virtual. Without virtual, only the base destructor runs and derived cleanup is skipped.
This causes resource leaks. If Derived allocates memory in its constructor, that memory leaks when you delete through a Base pointer because Derived's destructor never executes. Always make base class destructors virtual when you expect polymorphic deletion.
Write virtual ~Base() { } even if the body is empty. This ensures the correct destructor chain runs.