为什么即使子类定义了抽象函数,我也会得到一个抽象错误?

use*_*403 2 delphi function dynamic call

我有一个Packet抽象方法的类getID:

Type
  Packet = class
    ...
    function getID() : Integer;virtual;abstract;
    class procedure writePacket(par0 : Packet; par1 : TIdTCPConnection);
    ...
implementation 

class procedure Packet.writePacket(par0 : Packet; par1 : TIdTCPConnection);
// par1 is a TCP connection used to send data through the network; 
begin
  par1.writeInteger(par0.getID());
  //some code following 
end;
Run Code Online (Sandbox Code Playgroud)

我有以下子类:

type
  PacketTest = class(Packet)
    ...
    function getID() : Integer;
    ...

function PacketTest.getID():Integer;
begin
  result := {some value individual for each subclass}
end;
Run Code Online (Sandbox Code Playgroud)

现在我writePacket用包的子类调用超类的类过程,par0然后调用子类的函数getID.相反,它调用超类的函数,getID并且(当然)抛出一个抽象错误.

我希望它动态调用子类的函数getID,它应该永远不会引起问题,因为par0它总是一个子类,Packet因为Packet它本身就是抽象的.

Ste*_*eve 6

getID子类中的声明必须具有override关键字:

type
  PacketTest = class(Packet)
    function getID: Integer; override;
  end;

function PacketTest.getID: Integer;
begin
  Result := {some value individual for each subclass}
end;
Run Code Online (Sandbox Code Playgroud)

  • @User,在发生此错误之前,您必须忽略多个警告.首先,编译器警告您子类函数隐藏了基类的虚方法.其次,编译器警告您,您正在创建具有抽象方法的类的实例.永远不要禁用或忽略编译器警告. (4认同)