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

问题描述 投票:1回答:2

这个问题可能适用于所有/大多数面向对象的编程语言,但我只关心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工作!但是我可以在手柄副本之后这样做吗?我可以在jaguar class super方法中使用vehicle_type()关键字:

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

并得到输出:

Four-wheeler
Jaguar

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

oop system-verilog
2个回答
2
投票

我担心与c ++不同,你在这方面的表现非常有限(比如在java中)。所以,所有语言都不同。

与java类似,SystemVerilog为您提供了可在类成员中使用的关键字“super”。您必须创建一个特定的类成员函数来访问非类作用域中的基类(超级)类成员:

class jaguar extends four_wheeler;
   ...

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

endclass:jaguar

现在你可以使用了

jaguar_h.super_vehicle_type();

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

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

在上面的例子中,您可以使用任何基类(而不是four_wheeler)作为类范围。


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
© www.soinside.com 2019 - 2024. All rights reserved.