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