Yes, here it is. Another class instantiates a FrameEx object:
AAdd(oExSyntaxRef:aFrameEx,(oFrameEx:=FrameEx{nVerbLoc,oVerb,TRUE}))
These are the class definitions of Frame and FrameEx:
CLASS FrameEx INHERIT Frame
EXPORT lPositive AS LOGIC
EXPORT aFEsLiteral AS ARRAY
EXPORT aFEsObj AS ARRAY
EXPORT aRelations AS ARRAY
EXPORT aRelatedFrames AS ARRAY
EXPORT nVerbRef AS BYTE
EXPORT nScore AS BYTE
EXPORT aEmbeddingFEs AS ARRAY
EXPORT lFEsConform AS LOGIC
EXPORT aUnassignedObj AS ARRAY
EXPORT lViaVN AS LOGIC
CLASS Frame
EXPORT nRec AS LONG
EXPORT ccName AS STRING
EXPORT cDef AS STRING
EXPORT aFEs AS ARRAY
EXPORT aGramObjs AS ARRAY
EXPORT cRelation AS STRING
EXPORT aEmbedded AS ARRAY
And the CONSTRUCTORs:
CONSTRUCTOR(lInitialize) // for Frame
LOCAL y AS BYTE
LOCAL cRec AS STRING
LOCAL aSFE[0],aOFE[0],aOtherFE[0] AS ARRAY
LOCAL oFE AS FE
SELF:aGramObjs:={}
SELF:cRelation:=""
IF lInitialize
SELF:nRec:=0
SELF:ccName:=""
SELF:cDef:=""
SELF:aFEs:={}
ELSE
SELF:nRec:=RecNo()
SELF:ccName:=Trim(cName)
SELF:cDef:=Def
SELF:aFEs:={}
cRec:=base16(RecNo(),2)
DbSelectArea("FE")
DbSeek(cRec)
AAdd(SELF:aFEs,FE{TRUE})
WHILE cRec==nFrame
oFE:=FE{FALSE}
IF oFE:nGramSlot=0
AAdd(aSFE,oFE)
ELSEIF oFE:nGramSlot=1
AAdd(aOFE,oFE)
ELSE
AAdd(aOtherFE,oFE)
ENDIF
DbSkip()
ENDDO
FOR y:=1 UPTO ALen(aSFE)
AAdd(SELF:aFEs,aSFE[y])
NEXT
FOR y:=1 UPTO ALen(aOFE)
AAdd(SELF:aFEs,aOFE[y])
NEXT
FOR y:=1 UPTO ALen(aOtherFE)
AAdd(SELF:aFEs,aOtherFE[y])
NEXT
SELF:aEmbedded:=ArrayNew(ALen(SELF:aFEs))
AFill(SELF:aEmbedded,FALSE)
ENDIF
RETURN SELF
CONSTRUCTOR(nVerbRef,oWord,lViaVN) // for FrameEx
LOCAL nFE1Loc,nFE2Loc AS BYTE
LOCAL nFE1Rec,nFE2Rec AS LONG
LOCAL cRec AS STRING
LOCAL cElements AS STRING
SELF:nRec:=RecNo()
SELF:ccName:=Trim(cName)
IF SELF:ccName=="Change_position_on_a_scale"
nFE1Loc:=1
ENDIF
SELF:cDef:=Def
SELF:aFEs:={}
cRec:=base16(RecNo(),2)
cElements:="FrameEx:init: "+NTrim(RecNo())+" = "+cRec+CRLF
cElements+=SELF:ccName+CRLF
DbSelectArea("FE")
DbSeek(cRec)
cElements+="In FE.dbf:"+CRLF+NTrim(RecNo())+CRLF
WHILE cRec==nFrame
cElements+=NTrim(RecNo())+CRLF
DbSkip()
ENDDO
DbSelectArea("FE")
DbSeek(cRec)
AAdd(SELF:aFEs,FEEx{TRUE})
WHILE cRec==nFrame
AAdd(SELF:aFEs,FEEx{FALSE})
DbSkip()
ENDDO
SELF:aEmbedded:=ArrayNew(ALen(SELF:aFEs))
AFill(SELF:aEmbedded,FALSE)
DbSelectArea("FEFESAFR")
DbSeek(cRec)
WHILE Frme==cRec
IF RelateType="1"
nFE1Rec:=base10(FE1)
nFE1Loc:=AScan(SELF:aFEs,{|x|x:nCNameRec=nFE1Rec})
nFE2Rec:=base10(FE2)
nFE2Loc:=AScan(SELF:aFEs,{|x|x:nCNameRec=nFE2Rec})
IF SELF:aFEs[nFE2Loc]:aSubFEs==NULL_ARRAY
SELF:aFEs[nFE2Loc]:aSubFEs:={}
ENDIF
AAdd(SELF:aFEs[nFE2Loc]:aSubFEs,SELF:aFEs[nFE1Loc])
SELF:aEmbedded[nFE1Loc]:=TRUE
ENDIF
DbSkip()
ENDDO
SELF:aGramObjs:={}
SELF:cRelation:=""
SELF:lPositive:=TRUE
IF!IsNil(oWord)
SELF:aFEsLiteral:={oWord:cLiteral}
SELF:aFEsObj:={oWord}
ENDIF
SELF:aRelations:={}
SELF:aRelatedFrames:={}
SELF:nVerbRef:=nVerbRef
SELF:nScore:=0
SELF:aEmbeddingFEs:={}
SELF:lFEsConform:=TRUE
SELF:aUnassignedObj:={}
SELF:lViaVN:=lViaVN
RETURN SELF
In VO, only one of these inits is executed, depending on the CLASS. In X#, according to the callstack, both CONSTRUCTORs are executed for some reason. In that case, to answer your question, yes, instantiating FrameEx calls the SUPER() CONSTRUCTOR, which would be Frame:init(), which in X# would be Frame.ctor().
I circumvented the problem by recoding Frame and FrameEx as two separate CLASSes, as well as encapsulating CLASSes FE and FEex, with no inheritance, and it works fine. I was a little concerned that future developers, however, may require inherited or inheriting CLASSes and face the same problem.