Inheritance 扩展类中的系统verilog变量
当我运行下面的示例时,disp()函数显示“来自class1的值”。我在努力理解 为什么它不显示“来自类2的值”。有人能帮我理解这里的概念吗Inheritance 扩展类中的系统verilog变量,inheritance,system-verilog,Inheritance,System Verilog,当我运行下面的示例时,disp()函数显示“来自class1的值”。我在努力理解 为什么它不显示“来自类2的值”。有人能帮我理解这里的概念吗 class class1; string reg_name = "value from class1"; function new(string name="class1"); endfunction function void disp(); $display(&
class class1;
string reg_name = "value from class1";
function new(string name="class1");
endfunction
function void disp();
$display("disp: reg_name=%p", reg_name);
endfunction
endclass
class class2 extends class1;
string reg_name = "modified value";
function new(string name="class2");
reg_name = "value from class2";
endfunction
endclass
program if_p;
class2 c2;
initial
begin
c2 = new();
c2.disp();
end
endprogram
您看到示例显示“来自class1的值”的行为的原因在于两个原则
super.reg\u name
,才能访问基类变量class1
中对reg\u name
的所有引用都将指向class1
即使语言允许,一般规则是永远不要在基类和扩展类中使用相同的名称命名变量。我从来没有看到这样做的好理由。更新:实际上,如果在类2中删除reg_name的声明,它会按预期工作。如果disp()声明为“virtual”,它的行为会有任何变化吗?您必须在扩展类中声明disp()virtual并重写它。这是OOP的一个非常基本的原则,我建议你看一些教程,而不是一次只问一个问题。