如果我有子类,子类继承父类的所有方法,但是如何使用父类中子类的函数?抽象是什么?我该如何完成它?
我的代码:
type
cParent = class(TObject)
private
function ParentFunction:byte;
function ChildFunction:byte;virtual;abstract;
end;
type
cChild = class(cParent)
private function ChildFunction:byte;override;
end;
function cChild.ChildFunction:byte;
begin
Exit(20);
end;
function cParent.ParentFunction:byte;
begin
Exit(10);
end;
var
c:cParent;
begin
c:= cParent.Create;
WriteLn(c.ChildFunction);
Readln;
end.
它编译文件,但我得到了抽象异常。
答案 0 :(得分:5)
c:= cParent.Create;
WriteLn(c.ChildFunction);
您可以在此处创建cParent类的实例。此类仅包含可由其他类重写的抽象ChildFunction。该函数未在cParent中实现,因此您会收到一个抽象错误。
如果你使用cChild类,代码就可以了,其中实现了ChildFunction:
c:= cChild.Create;
WriteLn(c.ChildFunction);
为了澄清,假设一个名为GeometricObject
的父类具有虚拟抽象方法CalculateVolume
。您现在可以使用球体/框的公式创建实现SphereObject
的{{1}}或BoxObject
子类。但是创建CalculateVolume
的实例并调用GeometricObject
答案 1 :(得分:2)
您创建cParent类的实例。这个类没有childFunction的实现。 c必须是cChild类的实例。 正确的代码: c:= cChild.Create; WriteLn(c.ChildFunction);
答案 2 :(得分:1)
使用子类创建实例:
c:= cChild.Create;
答案 3 :(得分:0)
在我看来,你混淆了继承关系和占有欲关系。如果您将类“cChild”定义为继承自“cParent”类,则类“cChild” 是“cParent”,并不意味着“Parent”类可以访问任何子级类。你可以在类“cParent”中调用抽象函数“ChildFunction”的唯一方法来自另一个函数,例如“ParentFunction”,但仅限于Object本身不是“cParent”:
function cParent.ParentFunction:byte;
begin
Result := ChildFunction * 2;
end;
var
c:cParent;
begin
c:= cChild.Create;
WriteLn(c.ParentFunction);
Readln;
end.
这里,由于c是cChild,因此ParentFunction正确调用了在cChild中定义的ChildFunction。
答案 4 :(得分:0)
回应schnaader,关于CS 101:
“virtual”表示该方法可以被子类重写。
不仅如此,非虚拟函数可能会被子类重写。差异非常重要:当父类调用虚函数时,将执行CHILD函数。这允许子类实现将由父类调用的函数,而父类不知道它们的任何信息。这是多态性的本质。