我有一个类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
本身是抽象的。
答案 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;