Two figures are created in the constructor. The first value of obj.thefig is overwritten. I guess, you already found out that with only the first figure the class behaves as you expect. Comment out the second call to figure to verify.
The problem is with the anonymous function
@(src,evt) (disp('not allowed'))
Object Scope and Anonymous Functions
Anonymous functions take a snapshot of the argument values when you define the
function handle. You must, therefore, consider this scoping when assigning the
Callback property. [...
clear name1 name2 name3 ...
the object is destroyed. h is a scalar handle object.[...
Thus, (it is a bit tricky to find all the relevant information) the method delete is called when the last handle (/reference) to the object is destroyed. The reason the method is not called in your example is that there is still a reference to the object in the anonymous function, which is attached to the figure.
To make the class behave as you expect, change the value of CloseRequestFcn of the figure:
obj.thefig = figure( 'CloseRequestFcn', 'disp(''not allowed'')' );
To remove the figure and the object from memory by brute force: