为何my_a.disp()输出父类内容且未报错?SystemVerilog代码解析
问题解答
1. 为何输出是"This is Class A"?
SystemVerilog的多态(动态方法调用)生效的核心前提是父类中的对应方法必须声明为virtual。只有父类方法标记为virtual时,通过父类句柄调用方法才会根据实际指向的对象类型,动态选择执行子类的重写方法。
你的代码里,父类A的disp()任务没有加virtual关键字,即便子类EA把自己的disp()声明为virtual,也无法触发多态机制。此时通过父类句柄my_a调用disp(),会直接执行父类的方法逻辑,而非子类的。
2. 第19、20行运行时的具体行为
- 第19行
my_ea=new();:创建一个子类EA类型的对象,让子类句柄my_ea指向这个对象。此时my_ea的静态类型和动态指向的对象类型都是EA。 - 第20行
my_a=my_ea;:这是SystemVerilog的句柄赋值操作,将子类句柄my_ea存储的EA对象内存地址,赋值给父类句柄my_a。此时my_a的静态类型是编译时确定的A,但动态指向的对象类型是EA。不过因为父类方法不是virtual,动态类型不会影响方法调用的选择逻辑。
3. 为何my_a.disp()既不返回null也不报错?
执行my_a.disp()前,my_a已经完成两次有效赋值:
- 首先
my_a=new();创建了父类A的对象,my_a指向该有效实例; - 随后
my_a=my_ea;让my_a指向了子类EA的有效对象。
也就是说,my_a始终指向一个合法的类实例,从未是null。而SystemVerilog中,只要句柄指向有效对象,即使方法不是virtual,也能正常执行对应静态类型的方法,因此不会报错。
内容的提问来源于stack exchange,提问作者debashish nath
相关产品推荐
相关产品推荐

