一旦基类对象被覆盖,如何使用它访问基类方法?

时间:2019-03-09 13:37:20

标签: oop system-verilog

这个问题可能适用于所有/大多数面向对象的编程语言,但我只关心SystemVerilog方面。 我以为我了解了多态性,直到前几天我与一位同事交谈时,这种情况才出现,我意识到我不知道该怎么做。 以下是本讨论要考虑的两个类-

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

我想使用自己的对象访问基类four_wheeler中的vehicle_type()函数。我可以在four_wheeler_h.vehicle_type()副本之前通过four_wheeler_h = jaguar_h进行此操作。常规OOP工作!但是复制手柄后可以做吗? 我可以在美洲虎类super方法中使用vehicle_type()关键字:

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

并获得输出:

Four-wheeler
Jaguar

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

2 个答案:

答案 0 :(得分:2)

恐怕与c ++不同,您的执行方式非常有限(如java)。因此,所有语言都是不同的。

类似于Java,SystemVerilog为您提供了关键字“ super”,您可以在类成员中使用它。您将必须创建一个特定的类成员函数来访问其在非类范围内的基(超级)类成员:

npm install

现在您可以使用

class jaguar extends four_wheeler;
   ...

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

endclass:jaguar

您还可以在函数中使用类范围标识符来访问任何基类。

jaguar_h.super_vehicle_type();

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

答案 1 :(得分:2)

简单的答案是,这不是虚拟方法的工作原理。多态性定义了它,以至于您不应该知道自己正在处理覆盖的类对象。这就像询问您是否已将成员声明为localprotected一样,是否可以从类外部访问该成员。答案也是但是 ...如果您在基类中提供了其他访问器方法,则可以通过多种方法来控制对这些成员变量和方法的访问。

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