Inheritance 扩展类中的系统verilog变量

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(&

当我运行下面的示例时,disp()函数显示“来自class1的值”。我在努力理解 为什么它不显示“来自类2的值”。有人能帮我理解这里的概念吗

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的值”的行为的原因在于两个原则

  • 当在扩展类中声明与基类中的变量同名的变量时,可以对该扩展类隐藏基类变量。If必须从扩展类中引用
    super.reg\u name
    ,才能访问基类变量
  • 除了虚方法之外,基类对扩展类中的任何内容都一无所知。
    class1
    中对
    reg\u name
    的所有引用都将指向
    class1

  • 即使语言允许,一般规则是永远不要在基类和扩展类中使用相同的名称命名变量。我从来没有看到这样做的好理由。

    更新:实际上,如果在类2中删除reg_name的声明,它会按预期工作。如果disp()声明为“virtual”,它的行为会有任何变化吗?您必须在扩展类中声明disp()virtual并重写它。这是OOP的一个非常基本的原则,我建议你看一些教程,而不是一次只问一个问题。