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

时间:2012-09-06 15:17:34

标签: 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;

我有以下子类:

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

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

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

我希望它动态调用子类的函数getID,它永远不会导致问题,因为par0始终是Packet的子类,因为Packet本身是抽象的。

1 个答案:

答案 0 :(得分: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;