一旦被覆盖,如何使用 base class 对象访问 base class 方法?

How can one access a base class method using base class object once it has been overwritten?

这个问题可能适用于 all/most 面向对象的编程语言,但我只关心 SystemVerilog 方面。 多态性,我以为我明白了,直到前几天我和一位同事交谈,这来了,我意识到我不知道如何做到这一点。 以下是为了本次讨论的目的需要考虑的两个 classes -

class four_wheeler;

    virtual function void vehicle_type();
        $display("Four-wheeler");
    endfunction:vehicle_type

    virtual task colour();
        $display("Many colours");
    endtask:colour
endclass:four_wheeler

class jaguar extends four_wheeler;

    function void vehicle_type();
        $display("Jaguar");
    endfunction:vehicle_type

    task colour();
        $display("Black");
    endtask:colour
endclass:jaguar

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;
    four_wheeler_h.vehicle_type();

  end

endprogram: sv_prog

我想使用它自己的对象访问基 class four_wheeler 中的 vehicle_type() 函数。我可以在 four_wheeler_h = jaguar_h 副本之前通过 four_wheeler_h.vehicle_type() 来完成此操作。正常的 OOP 工作!但是我可以在句柄复制之后做吗? 我可以在 jaguar class vehicle_type() 方法中使用 super 关键字:

function void vehicle_type();
    super.vehicle_type();
    $display("Jaguar");
endfunction:vehicle_type

并得到输出:

Four-wheeler
Jaguar

但我更感兴趣的是从程序块本身执行此操作,而不必修改 jaguar class 中的函数。有什么办法可以实现吗?也许从程序块本身使用 super

恐怕与 c++ 不同,您的实现方式非常有限(例如 java)。所以,所有的语言都是不同的。

类似于java,SystemVerilog 为您提供关键字'super',您可以在class 成员中使用它。您将必须创建一个特定的 class 成员函数来访问其在非 class 范围内的 base(super)-class 成员:

class jaguar extends four_wheeler;
   ...

   function super_vehicle_type();
     super.vehicle_type();
  endfunction

endclass:jaguar

现在您可以使用

jaguar_h.super_vehicle_type();

您还可以在函数中使用 class 作用域标识符来访问任何基础 classes。

   function super_vehicle_type();
     four_wheeler::vehicle_type();
  endfunction

在上述情况下,您可以使用任何基础 classes(而不是 four_wheeler)作为 class 范围。

简单的答案是,虚拟方法不是这样工作的。多态性以这样的方式定义它,你不应该知道你正在处理一个被覆盖的 class 对象。这就像询问您是否已将成员声明为 localprotected,是否有任何方法可以从 class 外部访问该成员。答案也是 no但是...如果您在基 class 中提供额外的访问器方法,则可以通过多种方式控制对这些成员变量和方法的访问。

class base;
  local int base_variable;
  virtual function void do_this;
  endfunction
  function int get_base_variable;
     return base_variable;
  endfunction
  function void base_to_this;
     base::do_this();
  endfunction
endless