The recursion is called by deleteMe calling delete , which calls B operator delete , which calls deleteMe again. Itβs okay to overload operator delete (although you usually overload operator new ), especially when processing "alien" objects, which is most likely your case, but you should, in turn, call the current cleanup procedure from user delete .
In general, an overloaded operator delete should match operator new . In your case:
B *p = new D;
Here p is highlighted by the global new , so it must be freed using global delete . So:
class D : public B { public: void deleteMe() { ::delete this; } };
source share