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

SV 类继承的多态性问题(NVDIA2019笔试)

 

 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

 

相关文章:

  • 2021-10-20
  • 2021-04-01
  • 2021-11-01
  • 2021-12-08
  • 2021-09-05
  • 2021-06-17
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-02-17
  • 2021-07-19
  • 2021-07-27
  • 2022-12-23
  • 2022-12-23
  • 2022-01-22
相关资源
相似解决方案