2012-09-06 11 views
2

我有一個類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是一直以來PacketPacket一個子類本身是抽象的。

回答

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; 
+0

非常感謝你的好先生。工作過,非常有幫助! – user1652403

+4

@User,在出現此錯誤之前,您必須忽略多個警告。首先,編譯器警告你,子類函數隱藏了基類的虛方法。其次,編譯器警告你,你正在創建一個具有抽象方法的類的實例。切勿禁用或忽略編譯器警告。 –

+0

@ user1652403然後接受答案,不只是「up」,而是按綠色的選中標記 –