虚方法错误 Abstract Error
//虚方法错误 --------------------------- Debugger Exception Notification --------------------------- Project GQ.exe raised exception class EAbstractError with message 'Abstract Error'. --------------------------- Break Continue Help --------------------------- 问题所在: 当时父类有虚函数 function GetSubForm(SubFormName:string):TForm;virtual;abstract; 子类 function GetSubForm(SubFormName:string):TForm; override; 没有加override 造成通过父类调用执行子类的方法时,发现没有实现父类的方法,因为若子类中没有加override关键字是相当于了重写了方法,而不是实现了父类的方法;//可以先判断一下这个类的这个虚方法是否有实现 function MethodIsImplemented(const AClass : TClass; MethodName : string) : Boolean; var m : TRttiMethod; begin Result := False; m := TRttiContext.Create.GetType(AClass.ClassInfo).GetMethod(MethodName); if m <> nil then Result := CompareText(AClass.ClassName, m.Parent.Name) = 0; end; //调用 if MethodIsImplemented(AfrmPluginObject.FormClass, 'DoonRecvDBFailEvent')then
T1 = Class(TObject) //这个我们假设是基类 public function f1();virtual;abstract; End; T1s = Class(T1) //这个是我们用到的类的父类 public function f1();override; End; T1ss = Class(T1s) //这个是我们用到的类(开始的认为) public function f1();override; End; //这样一看一切都正常 // //但是这个工程用了动态类型的方法 // //即:O1 : T1;然后在动态找到类型后 O1 := T(动态找到的类型).create;接着O1.f1; // //结果发现还有一个类: T1a = Class(T1) //这个是我们用到的类的父类 public function f2();virtual;abstract; End; T1as = Class(T1a) //这个是我们用到的类 public function f2();override; End; //其实O1是T1as。 // //这样我既不能直接用f1,也不能直接用f2。只能用以下方法处理。 // //在T1中添加f2,然后在将O1.f1改为: if O1.classParent = T1a then O1.f2 else O1.f1;
说的是两个不懂的子类,A子类是有f1方法,B子类有f2方法,执行f1还是f2 通过判断一下子父类再执行。感觉这个例子有缺陷。