class base { };
class derived: public base { };
int main() {
base* p = new derived();
delete p; // The is undefined behavior!
}
In section [expr.delete] ยง5.3.5/3 the standard says that if delete
is called on an object whose static type does not have a virtual
destructor:
if the static type of the object to be deleted is different from its dynamic type, the static type shall be a base class of the dynamic type of the object to be deleted and the static type shall have a virtual destructor or the behavior is undefined.
This is the case regardless of the question whether the derived class added any data members to the base class.