2015-09-18 23 views
0

我試圖把握鑄造的SystemVerilog中的概念,並已用下面的代碼修修補補:

class packet; 

    virtual function int compute_crc(); 
    compute_crc = 12345; 
    endfunction 

    virtual task print; 
    $display("This is a packet"); 
    endtask 

endclass: packet 

class bad_packet extends packet; 

    function int compute_crc(); 
    compute_crc = 54321; 
    endfunction 

    task print; 
    $display("This is a bad packet"); 
    endtask 

    task print2; 
    $display("This is not accessible from base"); 
    endtask 

endclass: bad_packet 

module test; 
    packet  pkt; 
    bad_packet b_pkt; 

    initial begin 
    b_pkt = new(); 

    pkt = b_pkt; 

    $cast(b_pkt, pkt); 
    b_pkt.print; 
    pkt.print; 

    end 
endmodule 

我有一個基類「包」和派生類的bad_packet「。通過使用$ cast,我可以訪問bad_packet的方法print2嗎?還有其他的方法嗎?謝謝!

回答

0

是的,使用$ cast是訪問所有不存在的方法作爲基類中的虛擬方法的典型方法。想一想 - 如果你知道你想調用一些只存在於擴展類中的東西,你需要知道這個擴展類的類型,所以你將永遠可以聲明一個類型的類變量並且對其進行$轉換。

在擴展類中還有一種調用非虛方法的間接方法,但它仍然涉及調用基類中的虛方法。你調用一個虛擬方法讓你進入擴展類,該方法可以調用擴展類對象中的任何東西。這是clone()/ copy()方法在許多方法中所做的。

+0

我能夠從數據包類訪問bad_packet的compute_crc方法,但我試圖從數據包類內部訪問bad_packet的print2方法,因爲該數據包內不存在該方法,所以標記了一個錯誤。那麼這是否意味着只有在基類中存在該方法的虛擬版本時,我才能從擴展類訪問方法? –

+0

如果將方法定義爲**基類類型**中的虛方法,則只能訪問其**句柄存儲在**基類變量**中的**擴展類對象**中的方法。 –

相關問題