我试图与功能一起理解'虚拟'关键字。
我做了如下实验,
class A ;
function void disp ();
$display(" Non-Virtual from A ");
endfunction
virtual function void vdisp ();
$display(" Virtual from A ");
endfunction
endclass
class EA extends A ;
function void disp ();
$display(" Non-Virtual from EA ");
endfunction
virtual function void vdisp ();
$display(" Virtual from EA ");
endfunction
endclass
module main ;
function void disp( A a);
a.disp();
a.vdisp();
endfunction
A my_a;
EA my_ea;
initial
begin
my_a = new();
my_ea = new();
disp(my_a);
disp(my_ea);
end
endmodule
我从代码中得到了以下消息,
Non-Virtual from A
Virtual from A
Non-Virtual from A
Virtual from EA
但是我的期望是这样
Non-Virtual from A
Virtual from A
Non-Virtual from EA
Virtual from EA
“ vitual”关键字在systemverilog中有什么作用?
请您解释为什么我得到这个结果?以及如何解决这个问题?
答案 0 :(得分:0)
您已经构造了两个对象,一个对象的类型为A
,其句柄存储在my_a
中,另一个对象的类型为EA
,其句柄存储在my_ea
中。调用disp(my_ea)
时,会将EA
句柄上移到类型为a
的函数参数类变量A
。
当您调用非虚函数时,它使用类变量A
的固定类类型a
来选择要调用的方法。因此function A::disp
被呼叫。
调用虚拟函数时,存储在类变量EA
中的类句柄a
的动态类型用于选择调用哪个方法。因此EA::disp
被调用。
答案 1 :(得分:0)
换句话说:虚函数是一种特殊类型的函数,当被调用时,它会执行存在于父类和子类之间的“最”子方法。此属性也称为多态性。当子方法的签名(名称、参数类型、方法是否为常量)和返回类型与父类方法的签名和返回类型匹配时,将调用子方法。此类方法称为覆盖(或“覆盖方法”)。因为 class EA extends A
,你得到了 Virtual from EA
,作为 EA
的方法大多数孩子)