activate window "debug output" ox = createobject( "g2" ) ox.Draw() oy = createobject( "g2a" ) oy.Draw() return function AbstractWarn() local lcSetAssert lcSetAssert = set("Assert") set Assert on assert .f. Message Program() + " should be overwritten !" set Assert &lcSetAssert define class GraphicAbstractObject as custom x = 0 y = 0 function moveTo( newX, newY ) = AbstractWarn() endfunc function draw() = AbstractWarn() endfunc enddefine define class G1 as GraphicAbstractObject function draw() debugout 'level G1' return enddefine define class G2 as G1 function draw() dodefault() debugout 'level G2' return enddefine define class G1a as GraphicAbstractObject enddefine define class G2a as G1a function draw() dodefault() debugout 'level G2' return enddefineox outputs as expected, oy will throw the assert because of the dodefault() call with no method override at the G1a level. So you'd be forced to remove the dodefault() from G2a, but when the G1a class designer decides that they have to provide implementation of the Draw() method they've broken the G2a class because it won't execute the inherited G1a code.