var url = UrlResolver.Current.GetUrl(CurrentPage.SpecificDocument)
现在我做的时候
class my_a;
int member1 = 1;
endclass
class my_ea extends my_a;
int member1 = 2;
endclass
my_a A;
my_ea EA;
EA =new();
A=EA;
已将类型为EA = new();
的对象的句柄赋予类变量my_ea
。
EA
将相同的句柄(指向A=EA;
的对象的指针值)传递给my_ea
。因此,A
应该引用值2。
但它指的是价值1.为什么?
答案 0 :(得分:0)
到目前为止,System-Verilog不允许覆盖类变量。只能覆盖虚拟方法。
没有像类成员的虚拟,所以父类永远不能直接访问它们。使用 class_object.member 时,会引用特定类。从此以后,这是不可能的。
答案 1 :(得分:0)
您无法通过扩展类来重新定义现有成员。您应该使用虚拟方法来访问(获取/设置)它们。例如,我在代码中添加了“get_member1”函数,并且当从基类句柄调用时它返回2。
class my_a;
int member1 = 1;
virtual function int get_member1();
return member1;
endfunction
endclass
class my_ea extends my_a;
int member1 = 2;
virtual function int get_member1();
return member1;
endfunction
endclass
module tb;
initial begin
my_a A;
my_ea EA;
EA =new();
A=EA;
$display("%0d", A.get_member1());
end
endmodule
您可以类似地定义“set_member1(int value)”函数并使用它来更改其值。
答案 2 :(得分:0)
在您的情况下,A.member1
应该返回其自己类的原始成员。当您覆盖类成员时,您基本上隐藏了被覆盖的成员。超级/基类永远不能访问其子类中的重写成员。
据我所知,只有用virtual
,randomize()
函数和类constraint
标识的方法才能被覆盖,而不会将它们从基类中隐藏 - 因此它们允许基类引用他们(多态)
有关详细信息,请参阅第8.14节“重写成员”中的IEEE 1800-2012。