SystemVerilog中基类方法被重写后如何通过基类句柄调用?
在SystemVerilog中绕过多态调用基类虚方法的解决方案
刚好碰到过类似的问题!你想在基类句柄four_wheeler_h指向派生类对象jaguar_h之后,不修改jaguar类代码的前提下,直接调用基类four_wheeler的vehicle_type()方法对吧?
首先得明确,SystemVerilog里虚方法的多态特性就是——当基类句柄指向派生类对象时,调用虚方法会自动绑定到派生类的实现,这也是你现在默认调用到jaguar类方法的原因。
要绕过动态绑定直接调用基类方法,其实有个很直接的办法:使用基类名配合作用域解析运算符::,显式指定调用基类的方法,并传入当前的对象句柄。
把你的program块改成这样就行:
program sv_prog; initial begin four_wheeler four_wheeler_h; jaguar jaguar_h; four_wheeler_h = new(); jaguar_h = new(); four_wheeler_h = jaguar_h; // 直接调用基类的vehicle_type方法,无需修改jaguar类 four_wheeler::vehicle_type(four_wheeler_h); end endprogram: sv_prog
这个语法的本质是,把对象句柄作为隐式的this参数传递给基类的方法,完全绕过了虚方法的动态查找机制,强制调用基类中定义的实现。而且这个方法同样适用于虚任务,比如你想调用基类的colour任务,只需要写成four_wheeler::colour(four_wheeler_h);就行。
至于你提到的在program块里用super,这确实走不通——super关键字只能在类的内部使用,用来访问父类的成员,在类外部的program或者module里是不允许使用的,所以这个思路直接排除。
这种方式完全不需要修改派生类的任何代码,所有操作都在调用端完成,完美满足你的需求。
内容的提问来源于stack exchange,提问作者Timothy Grant
相关产品推荐
相关产品推荐

