SV 類繼承的多態性問題(NVDIA2019筆試)


1、原題

class class_a;
        virtual function void print_name();
            $display("this is class_a");
        endfunction
endclass

class class_b extends class_a;
        virtual function void print_name();
            $display("this is class_b");
        endfunction
endclass

module test;
    initial begin
    begin:class_test1
            class_a a;
            class_b b;
            a = new();
            b = new();
            a.print_name();
            b.print_name();
    end
    begin:class_test2
            class_a a;
            class_b b;
            b = new;
            a = b;
            a.print_name();
            b.print_name();
    end
    begin:class_test3
            class_a a;
            class_a a2;
            class_b b;
            class_b b2;
            b = new();
            a = b;
            a2 = new();
            b2 = b;
            a2.print_name();
            $cast(a2,a);
            a2.print_name();
            b2.print_name();
    end
    end

endmodule

 

 2、執行結果

  1)使用a=new會創建一個新對象,並且將句柄a指向這個新創建的對象;使用a=b不會創建新對象,只是將句柄a指向已經存在的對象b

  2)原因:基類中display()為虛函數,具體調用哪個x.dispaly()取決於句柄x所指向的對象類型,而不是取決於x這個句柄本身的類型

# this is class_a
# this is class_b
# this is class_b
# this is class_b
# this is class_a
# this is class_b
# this is class_b

  3)原因:同2

# this is class_a
# this is class_b
# this is class_b
# this is class_b
# this is class_a
# this is class_b
# this is class_b

  4)原因:基類中display()不為虛函數,具體調用哪個x.dispaly()取決於x這個句柄本身的類型

# this is class_a
# this is class_b
# this is class_a
# this is class_b
# this is class_a
# this is class_a
# this is class_b

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM